Cod sursa(job #998445)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 17 septembrie 2013 00:25:17
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <algorithm>

#include <cstdio>
#include <cstring>
using namespace std;

const int MAX_N = 100002;

int N, Max, K;
int v[MAX_N], best[MAX_N], pre[MAX_N], A[MAX_N], a[MAX_N], sol[MAX_N];
char S[MAX_N*11];
inline void Update(int pos, int ind) {
    for( ; pos <= N; pos += pos^(pos&(pos-1))) {
        if(best[ind] > best[A[pos]])
            A[pos] = ind;
    }
}

inline int Query(int pos) {
    int ind = 0;
    for( ; pos > 0; pos -= pos^(pos&(pos-1)))
        if(best[A[pos]] > best[ind])
            ind = A[pos];
    return ind;
}

int main() {
    FILE *f, *g;
    f = fopen("scmax.in", "r");
    g = fopen("scmax.out", "w");

    fscanf(f, "%d", &N);
    fgets(S, 3, f);
    fgets(S, 11000000, f);
    int len = strlen(S) - 1;
    for(int i = 0, k = 0; i < len; ++i)
        if(S[i] >= '0' && S[i] <= '9') {
            int temp = 0;
            while(i < len && S[i] >= '0' && S[i] <= '9')
                temp = temp*10 + S[i]-'0', ++i;
            ++k;
            v[k] = a[k] = temp;
        }

    sort(a+1, a+N+1);
    K = 1;
    for(int i = 2; i <= N; ++i)
        if(a[i] != a[K])
            a[++K] = a[i];
    int temp = 0;
    for(int i = 1; i <= N; ++i) {
        int x = lower_bound(a+1, a+K+1, v[i])-a;
        int p = Query(x-1);
        best[i] = best[p] + 1, pre[i] = p;
        if(best[i] > Max)
            Max = best[i], temp = i;
        Update(x, i);
    }
    for(int i = Max; i; --i) {
        sol[i] = v[temp];
        temp = pre[temp];
    }

    fprintf(g, "%d\n", Max);
    for(int i = 1; i <= Max; ++i)
        fprintf(g, "%d ", sol[i]);
    fprintf(g, "\n");

    fclose(f);
    fclose(g);

    return 0;
}