Cod sursa(job #1027702)

Utilizator invincibleInvincibilul invincible Data 12 noiembrie 2013 22:43:29
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

#define NMAX 100007
#define x first
#define y second

using namespace std;

int a[NMAX], n, best[NMAX];
vector<int> sol;

inline int search(int val, vector< pair<int, int> > v){
    int st = 0, dr = v.size(), med, last = -1;
    while(st <= dr){
        med = (st + dr) >> 1;
        if(v[med].x >= val){
            dr = med - 1;
            last = med;
        }
        else
            st = med + 1;
    }
    return last;
}

void solve(int a[NMAX]){
    vector< pair<int,int> > v;
    v.push_back(make_pair(a[1], 1));
    best[1] = 1;
    for(int i = 2; i <= n; ++ i){
        int Number = search(a[i], v);
        if(Number == -1){
            v.push_back(make_pair(a[i], i));
            best[i] = best[v[v.size() - 2].y] + 1;
        }
        else{
            v[Number].x = a[i];
            v[Number].y = i;
            best[i] = best[Number] + 1;
        }
    }
    int Max = 0;
    sol.push_back(0);
    for(int i = 1; i <= n; ++ i){
        Max = max(Max, best[i]);
        if(Max == best[i])
            sol[0] = a[i];
        ///printf("%d ", best[i]);
    }
    -- Max;
    for(int i = n; i >= 1; -- i)
        if(best[i] == Max && a[i] < sol[sol.size() - 1]){
            sol.push_back(a[i]);
            -- Max;
        }
}

int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++ i)
        scanf("%d", &a[i]);
    solve(a);
    printf("%d\n", sol.size());
    for(int i = sol.size() - 1; i >= 0; -- i)
        printf("%d ", sol[i]);
    return 0;
}