Pagini recente » Cod sursa (job #1154220) | Cod sursa (job #1449133) | Cod sursa (job #1083331) | Cod sursa (job #1198833) | Cod sursa (job #1339157)
/*
#include <fstream>
#define dmax 100005
#define IN "scmax.in"
#define OUT "scmax.out"
using namespace std;
ifstream fin (IN);
ofstream fout (OUT);
int n;
long long lg[dmax], urm[dmax], v[dmax];
void read();
void rez();
void write();
int main()
{
read();
rez();
write();
return 0;
}
void read()
{
fin>>n;
for (int i=1; i<=n; ++i)
fin>>v[i];
}
void rez()
{
lg[n]=1;
urm[n]=0;
for (int i=n-1; i>0; --i)
{
long long maxx=1;
int pozmax=0;
for (int j=i+1; j<=n; ++j)
if (v[i]<v[j])
if (maxx<1+lg[j])
{
maxx=1+lg[j];
pozmax=j;
}
lg[i]=maxx;
urm[i]=pozmax;
}
}
void write()
{
long long maxx=lg[1];
int pozmax=1;
for (int i=2; i<=n; ++i)
if (maxx<lg[i])
{
maxx=lg[i];
pozmax=i;
}
fout<<maxx<<'\n';
for (int i=pozmax; i!=0; i=urm[i])
fout<<v[i]<<' ';
fout.close();
}
*/
#include <cstdio>
#define dmax 100005
#define IN "scmax.in","r"
#define OUT "scmax.out","w"
using namespace std;
//ifstream fin (IN);
//ofstream fout (OUT);
FILE*fin=fopen(IN);
FILE*fout=fopen(OUT);
int n, pozcr=1;
int best[dmax], poz[dmax], v[dmax], sol[dmax];
void read();
void rez();
void write();
int CB(int,int);
int main()
{
read();
rez();
write();
return 0;
}
void read()
{
//fin>>n;
fscanf(fin,"%d",&n);
for (int i=1; i<=n; ++i)
//fin>>v[i];
fscanf(fin,"%d",&v[i]);
}
void rez()
{
best[1]=v[1];
poz[1]=1;
for (int i=2; i<=n; ++i)
if (v[i]>best[pozcr])
{
best[++pozcr]=v[i];
poz[i]=pozcr;
}
else
{
poz[i]=CB(i,pozcr);
best[poz[i]]=v[i];
}
}
int CB(int i,int m)
{
int st=1, dr=m, mij;
while (dr-st>1)
{
mij=(st+dr+1)/2;
if (best[mij]>v[i])
st=mij;
else
dr=mij;
}
return st;
}
void write()
{
//fout<<pozcr<<'\n';
fprintf(fout,"%d\n",pozcr+1);
int p=pozcr;
for (int i=n; i>0; --i)
if (poz[i]==pozcr)
sol[pozcr--]=v[i];
for (int i=1; i<=p; ++i)
//fout<<sol[i]<<' ';
fprintf(fout,"%d ",sol[i]);
//fout.close();
fclose(fout);
}