Pagini recente » Cod sursa (job #2930890) | Cod sursa (job #1645670) | Cod sursa (job #2119843) | Cod sursa (job #1196239) | Cod sursa (job #1450979)
#include <stdio.h>
#include <algorithm>
#include <deque>
using namespace std;
const int MAX_N = 100000;
int v[MAX_N + 1], N;
void N_patrat() {
int L[MAX_N + 1] = {0}, next[MAX_N + 1] = {0};
L[N] = 1, next[N] = 0;
for (register int i = N - 1; i > 0; -- i) {
L[i] = 1, next[i] = 0;
for (register int j = i + 1; j <= N; ++ j)
if (v[i] < v[j] and L[j] + 1 > L[i])
L[i] = L[j] + 1, next[i] = j;
}
int lis = L[1], poz = 1;
for(register int i = 2; i <= N; ++ i)
if(L[i] > lis)
lis = L[i], poz = i;
printf("%d\n", lis);
int x = poz;
while(true) {
printf("%d ", v[x]);
x = next[x];
if (!x)
break;
}
}
void N_log_N() {
int p[MAX_N + 1]={0}, q[MAX_N + 1] = {0};
q[1] = v[1];
p[1] = 1;
int sq = 1;
for(register int i = 1; i <= N; ++ i) {
int *pointer = lower_bound(q + 1, q + sq + 1, v[i]);
if(pointer == q + sq + 1)
q[++ sq] = v[i], p[i] = sq;
else
q[pointer - q] = v[i], p[i] = pointer - q;
}
printf("%d\n", sq);
int target = sq;
deque<int> sol;
for(register int i = N; i > 0; -- i) {
if(p[i] == target) {
sol.push_front(v[i]);
-- target;
}
}
deque<int> :: iterator it = sol.begin();
while(it != sol.end())
printf("%d ", *it), ++ it;
}
int main() {
freopen( "scmax.in", "r", stdin );
freopen( "scmax.out", "w", stdout );
scanf("%d", &N);
for(register int i = 1; i <= N; ++ i)
scanf("%d", &v[i]);
N_log_N();
printf("\n");
return 0;
}