Cod sursa(job #2743967)

Utilizator pibogaBogdan piboga Data 23 aprilie 2021 18:57:23
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 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(short searched, short index) {
/*    if (elements[searched] == elements[index]) {
        return false;
    }*/
    return elements[searched] < elements[index];
}

void printSeq(vector<short> predecessor, short index) {

    if (predecessor[index] == -1) {
        fout << elements[index] << " ";
        return;
    }
    printSeq(predecessor, predecessor[index]);
    fout << elements[index] << " ";
}

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

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

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

    lowestEndIndexes.push_back(0);
    // indecsii celor mai mici elemente care inchid un subsir de lungime <ID+1>

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

        short 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";

    printSeq(predecessor, lowestEndIndexes[lowestEndIndexes.size() - 1]);
}