Pagini recente » Cod sursa (job #383288) | Cod sursa (job #2421895) | Cod sursa (job #1161704) | Cod sursa (job #517605) | Cod sursa (job #544209)
Cod sursa(job #544209)
#include <iostream>
#include <cstdio>
#define NMAX 100005
using namespace std;
int V[NMAX], N, Q[NMAX], P[NMAX], S[NMAX], lenP, lenQ;
void read(void)
{
FILE *f = fopen("scmax.in", "r");
fscanf(f, "%d", &N);
for(int i = 1; i <= N; ++i)
fscanf(f, "%d", &V[i]);
fclose(f);
}
void insert(int x)
{
for(int i = 1; i <= lenQ; ++i)
if(x <= Q[i])
{
Q[i] = x;
P[++lenP] = i;
return;
}
Q[++lenQ] = x;
P[++lenP] = lenQ;
}
void solve(void)
{
P[1] = lenQ = lenP = 1, Q[1] = V[1];
for(int i = 2; i <= N; ++i)
insert(V[i]);
//for(int i = 1; i <= lenQ; ++i)
// cout << Q[i] << ' ';
for(int i = 1; i <= lenP; ++i)
cout << P[i] << ' ';
for(int i = lenQ, j = lenP; i; --i)
{
while(P[j] != i)
--j;
S[i] = j;
}
}
void print(void)
{
FILE *g = fopen("scmax.out", "w");
fprintf(g, "%d\n", lenQ);
for(int i = 1; i <= lenQ; ++i)
fprintf(g, "%d ", V[ S[i] ]);
fclose(g);
}
int main(void)
{
read();
solve();
print();
return 0;
}
/*int st = 1, dr = nr, m = (st+dr)/2, poz = nr + 1;
while(st <= dr)
{
if(Q[m] > x)
{
poz = m;
dr = m - 1;
}
else
st = m + 1;
}
if(poz == nr+1)
++nr;
Q[poz] = x;
P[++cnt] = poz;*/