Cod sursa(job #1210082)

Utilizator mihaimusatMihai Musat mihaimusat Data 19 iulie 2014 09:55:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int oo = 0x3f3f3f3f;

int N;
vector<int> Values, Answer;

vector<int> LongestIncreasingSubsequence(const vector<int> &values) {
    vector<int> minValue, index, father;
    minValue.push_back(-oo);
    index.push_back(-1);
    father = vector<int>(int(values.size()), -1);
    int maxLength = 0, last = -1;
    for (int i = 0; i < int(values.size()); ++i) {
        int length = lower_bound(minValue.begin(), minValue.end(), values[i]) - minValue.begin();
        if (length == int(index.size())) {
            minValue.push_back(values[i]);
            index.push_back(i);
        } else if (minValue[length] > values[i]) {
            minValue[length] = values[i];
            index[length] = i;
        }
        father[i] = index[length - 1];
        if (maxLength <= length) {
            maxLength = length;
            last = i;
        }
    }
    vector<int> sequence;
    for (int i = last; i != -1; i = father[i])
        sequence.push_back(values[i]);
    reverse(sequence.begin(), sequence.end());
    return sequence;
}

void Solve() {
    Answer = LongestIncreasingSubsequence(Values);
}

void Read() {
    ifstream cin("scmax.in");
    cin >> N;
    Values = vector<int>(N);
    for (int i = 0; i < N; ++i)
        cin >> Values[i];
    cin.close();
}

void Print() {
    ofstream cout("scmax.out");
    cout << int(Answer.size()) << "\n";
    for (int i = 0; i < int(Answer.size()); ++i)
        cout << Answer[i] << " ";
    cout << "\n";
    cout.close();
}

int main() {
    Read();
    Solve();
    Print();
    return 0;
}