Cod sursa(job #1438852)

Utilizator stefanzzzStefan Popa stefanzzz Data 20 mai 2015 23:55:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <vector>
#define MAXN 100005
#define MIN(a, b) (((a) < (b))?(a):(b))
using namespace std;

int n, v[MAXN], dp[MAXN], p[MAXN], sol;
vector<int> solv;

int main() {
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    int i;

    scanf("%d\n", &n);
    for(i = 1; i <= n; i++)
        scanf("%d ", &v[i]);

    for(i = 1; i <= n; i++) {
        if(p[sol] < v[i]) {
            p[++sol] = v[i];
            dp[i] = sol;
        }
        else {
            int l = 0, r = sol - 1, mid;

            while(l < r) {
                mid = (l + r) >> 1;
                if(p[mid] < v[i]) l = mid + 1;
                else r = mid - 1;
            }
            while(p[l] >= v[i]) l--;

            dp[i] = l + 1;
            p[l + 1] = MIN(p[l + 1], v[i]);
        }
    }

    printf("%d\n", sol);
    for(i = n; i >= 1; i--)
        if(dp[i] == sol) {
            --sol;
            solv.push_back(v[i]);
        }

    while(!solv.empty()) {
        printf("%d ", solv.back());
        solv.pop_back();
    }

    printf("\n");

    return 0;
}