Cod sursa(job #1328970)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 28 ianuarie 2015 22:01:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

#define Nmax 100100

using namespace std;

int N, Solution, A[Nmax], DP[Nmax], Best[Nmax], Father[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;
        Father[i] = position;

        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, int node) {

    if(Father[node] != 0)
        Write(out, Father[node]);

    out << A[node] << ' ';

}
void Write() {

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

    Write(out, Location[Solution]);

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

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

    return 0;
}