Cod sursa(job #2743975)

Utilizator pibogaBogdan piboga Data 23 aprilie 2021 19:12:09
Problema Subsecventa de suma maxima Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include<algorithm>
#include <fstream>
#include <vector>
#include <climits>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

vector<int> elements;

bool comparator(int searched, int index) {
    return elements[searched] < elements[index];
}

int main() {
    int noElem;
    fin >> noElem;

    for (int index = 0; index < noElem; ++index) {
        int elem;
        fin >> elem;
        elements.push_back(elem);
    }

    vector<int> lowestEndIndexes;
    vector<int> predecessor(noElem, -1);

    lowestEndIndexes.push_back(0);

    for (int index = 1; index < noElem; ++index) {
        auto binarySearchResult = lower_bound(lowestEndIndexes.begin(),
                                              lowestEndIndexes.end(),
                                              index,
                                              comparator);

        int position = binarySearchResult - lowestEndIndexes.begin();

        if (binarySearchResult == lowestEndIndexes.end()) {
            lowestEndIndexes.push_back(index);
        } else {
            *binarySearchResult = index;
        }

        if (binarySearchResult != lowestEndIndexes.begin()) {
            predecessor[index] = lowestEndIndexes[position - 1];
        }
    }

    fout << lowestEndIndexes.size() << "\n";
    int index = lowestEndIndexes[lowestEndIndexes.size() - 1];

    lowestEndIndexes.clear();
    while (1) {
        if (index == -1) {
            break;
        }
        lowestEndIndexes.push_back(index);
        index = predecessor[index];
    }

    for (index = lowestEndIndexes.size() - 1; index >= 0; --index) {
        fout << elements[lowestEndIndexes[index]] << " ";
    }

}