Cod sursa(job #1328963)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 28 ianuarie 2015 21:56:48
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>

#define Nmax 100100

using namespace std;

int N, Solution, A[Nmax], DP[Nmax], Best[Nmax], Location[Nmax];

int binarySearch(int value) {

    int i, step;

    for(step = 1; step < Solution; step <<= 1);

    for(i = 0; step != 0; step >>= 1)
        if(i + step <= Solution && Best[i + step] < value)
            i += step;

    return Location[i];
}
void Solve() {

    int i, position;

    DP[1] = 1;
    Solution = 1;
    Best[1] = A[1];
    Location[1] = 1;

    for(i = 2; i <= N; i++) {

        position = binarySearch(A[i]);
        DP[i] = DP[position] + 1;

        if(Best[DP[i]] == 0 || Best[DP[i]] > A[i]) {
            Best[DP[i]] = A[i];
            Location[DP[i]] = i;
        }

        if(DP[i] > Solution)
            ++Solution;
    }

}
void Read() {

    ifstream in("scmax.in");

    in >> N;
    for(int i = 1; i <= N; i++)
        in >> A[i];

    in.close();
}
void Write() {

    ofstream out("scmax.out");
    out << Solution << '\n';

    for(int i = 1; i <= Solution; i++)
        out << Best[i] << ' ';

    out << '\n';
    out.close();
}
int main() {

    Read();
    Solve();
    Write();

    return 0;
}