Cod sursa(job #2433153)

Utilizator melutMelut Zaid melut Data 25 iunie 2019 23:59:15
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;


string const inFile = "scmax.in";
string const outFile = "scmax.out";


ifstream Read(inFile);
ofstream Write(outFile);


unsigned BinarySearch(vector<unsigned> const &sorted, unsigned const value) {
    int left = 0;
    int right = sorted.size();
    int mid;

    while (left < right) {
        mid = (left + right) >> 1;

        if (sorted[mid] < value) {
            left = mid + 1;
        }
        else {
            right = mid;
        }
    }

    return left;
}


void BuildSequence(vector<unsigned> const &vec, vector<unsigned> const &length) {
    vector<unsigned> sequence;

    unsigned maxLength = 0;
    unsigned maxLengthIndex = 0;

    for (unsigned i = 0; i < length.size(); ++i) {
        if (length[i] > length[maxLengthIndex]) {
            maxLengthIndex = i;
        }
    }

    maxLength = length[maxLengthIndex];

    Write << maxLength << '\n';

    sequence.resize(maxLength);
    sequence[maxLength - 1] = vec[maxLengthIndex];

    --maxLength;

    for (unsigned i = maxLengthIndex; int(i) >= 0; --i) {
        if (length[i] == maxLength)
        if (vec[i] < vec[maxLengthIndex]) {
            maxLengthIndex = i;
            sequence[maxLength - 1] = vec[i];

            --maxLength;
        }
    }

    for (unsigned i = 0; i < sequence.size(); ++i) {
        Write << sequence[i] << ' ';
    }
}


int main() {
    unsigned n;
    vector<unsigned> vec;
    vector<unsigned> sorted;
    vector<unsigned> length;
    unsigned elementPos;

    Read >> n;

    vec.resize(n);
    length.resize(n);

    for (unsigned i = 0; i < n; ++i) {
        Read >> vec[i];

        elementPos = BinarySearch(sorted, vec[i]);

        if (elementPos >= sorted.size()) {
            sorted.push_back(vec[i]);
        }
        else {
            sorted[elementPos] = vec[i];
        }

        length[i] = elementPos + 1;
    }

    BuildSequence(vec, length);

    return 0;
}