Cod sursa(job #1248867)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 octombrie 2014 10:17:18
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
// Subsir crescator maximal - O(NlogN)
// last[i] - pozitia pe care s-a incheiat ultimul sir crescator de lungime i
// ante[i] = nodul anterior din scmaxul unde v[i] e capatul dreapta
#include<fstream>
#define Nmax 100099
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");

int N, v[Nmax], L, last[Nmax], ante[Nmax];

void SCMAX() {
    L = 1; // lungimea maxima gasita
    last[1] = 1; // ultimul sir maximal de lungime 1 s-a incheiat pe poz 1
    for (int i = 2; i <= N; ++i) {
        int st = 1, dr = L;
        while (st <= dr) {
            int mij = (st + dr) >> 1;
            if (v[i] > v[last[mij]]) { // v[i] poate extinde SIGUT sirul care se terminca cu v[ last[ mij] ] , poate chiar mai mult
                st=mij+1;
            } else { // v[i] trebuie sa extinda un sir al carui termen maxim e mai mare decat v[ last[ mij] ]
                dr=mij-1;
            }
        }
        if (st == L+1) {
            ++L; // am o noua solutie!
        }
        last[st] = i;
        ante[i] = last[st-1];
    }
}
void Build(int poz) {
    if (ante[poz]) {
        Build(ante[poz]);
    }
    g << v[poz] << ' ';
}

int main () {
    f >> N;
    for (int i = 1; i <= N; ++i) {
        f >> v[i];
    }
    SCMAX();
    g << L << '\n';
    Build(last[L]);
    return 0;
}