Pagini recente » Cod sursa (job #2697588) | Cod sursa (job #1661148) | Cod sursa (job #2336309) | Cod sursa (job #1515258) | Cod sursa (job #998448)
Cod sursa(job #998448)
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 100002;
int N, Max, K;
int v[MAX_N], a[MAX_N], F[MAX_N], sol[MAX_N];
pair < int, int > A[MAX_N];
char S[MAX_N*11];
inline void Update(int pos, pair < int, int > val) {
for( ; pos <= N; pos += pos^(pos&(pos-1))) {
if(val.first > A[pos].first)
A[pos] = val;
}
}
inline pair < int, int > Query(int pos) {
pair < int, int > x;
for( ; pos > 0; pos -= pos^(pos&(pos-1)))
if(A[pos].first > x.first)
x = A[pos];
return x;
}
inline int bs(int x) {
int l = 1, r = K, m = 0;
while(l <= r) {
m = (l+r)/2;
if(a[m] < x)
l = m+1;
else if(a[m] > x)
r = m-1;
else return m;
}
return 0;
}
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;
pair < int, int > p;
for(int i = 1, x; i <= N; ++i) {
x = bs(v[i]);
p = Query(x-1);
++p.first;
Update(x, make_pair(p.first, i));
if(p.first > Max)
Max = p.first, temp = i;
F[i] = p.second;
}
for(int i = Max; i; --i) {
sol[i] = v[temp];
temp = F[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;
}