Pagini recente » Cod sursa (job #2183837) | Cod sursa (job #922888) | Cod sursa (job #2977829) | Cod sursa (job #392017) | Cod sursa (job #676663)
Cod sursa(job #676663)
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
#define NM 100005
#define inf 1000000000
int N, A[NM], B[NM], W[NM], WB[NM], BA[NM];
void solve1()
{
scanf ("%d", &N);
for (int i = 1; i <= N; ++i) scanf ("%d", &A[i]);
for (int i = 1; i <= N; ++i)
for (int j = 0; j < i; ++j)
if (A[i] > A[j] && B[j] + 1 > B[i])
{
B[i] = B[j] + 1;
W[i] = j;
}
int best = 0, p;
for (int i = 1; i <= N; ++i)
if (B[i] > best)
{
best = B[i];
p = i;
}
printf ("%d\n", best);
B[0] = 0;
while (p)
{
B[++B[0]] = A[p];
p = W[p];
}
for (int i = B[0]; i > 0; --i) printf ("%d ", B[i]);
}
void solve2()
{
scanf ("%d", &N);
for (int i = 1; i <= N; ++i) scanf ("%d", &A[i]);
for (int i = 1; i <= N; ++i) B[i] = inf;
for (int i = 1; i <= N; ++i)
{
int st = 0;
int dr = N;
while (st < dr - 1)
{
int mij = (st + dr)/2;
if (A[i] > B[mij]) st = mij;
else dr = mij - 1;
}
int ind;
if (A[i] > B[dr]) ind = dr;
else ind = st;
BA[i] = ind + 1;
W[i] = WB[ind];
if (B[ind + 1] > A[i])
{
B[ind + 1] = A[i];
WB[ind + 1] = i;
}
}
int best = 0, p;
for (int i = 1; i <= N; ++i)
if (BA[i] > best)
{
best = BA[i];
p = i;
}
printf ("%d\n", best);
B[0] = 0;
while (p)
{
B[++B[0]] = A[p];
p = W[p];
}
for (int i = B[0]; i > 0; --i) printf ("%d ", B[i]);
}
int main()
{
freopen ("scmax.in", "r", stdin);
freopen ("scmax.out", "w", stdout);
solve2();
return 0;
}