Cod sursa(job #1027724)

Utilizator invincibleInvincibilul invincible Data 12 noiembrie 2013 23:04:50
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 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], Max;
int sol[NMAX];

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;
}

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]);
    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;
        }
    }
    for(int i = 1; i <= n; ++ i){
        Max = max(Max, best[i]);
    }
    for(int i = 1; i <= n; ++ i)
        if(Max == best[i]){
            sol[++ sol[0]] = a[i];
            break;
        }
    -- Max;
    for(int i = n; i >= 1 && Max >= 0; -- i)
        if(best[i] == Max){
            sol[++ sol[0]] = a[i];
            -- Max;
        }
    printf("%d\n", sol[0]);
    reverse(sol + 1, sol + sol[0] + 1);
    for(int i = 1; i <= sol[0]; ++ i)
        printf("%d ", sol[i]);
    printf("\n");
    return 0;
}