Pagini recente » Cod sursa (job #3227167) | Cod sursa (job #2159811) | Cod sursa (job #2079026) | Cod sursa (job #1315022) | Cod sursa (job #2438478)
//Patience-LIS
//O(n log n)
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<string.h>
#define nmax 100001
using namespace std;
int v[nmax],pachet[nmax],pred[nmax],ind[nmax];
int n;
ofstream fout("scmax.out");
void read()
{
ifstream fin("scmax.in");
fin>>n;
for(int i=1;i<=n;i++)
fin>>v[i];
memset(pachet,-1,sizeof(pachet));
memset(pred,-1,sizeof(pred));
memset(ind,-1,sizeof(ind));
pachet[1]=v[1];
ind[1]=1;
fin.close();
}
int bs(int pos,int last)
{
int st=1,dr=last,mid,x=v[pos],sol=-1,ok=0;
while(st<=dr )
{
if(st==dr) if(x<=pachet[st]) return st;
mid=(st+dr)/2;
//cout<<pachet[mid]<<' '<<x<<endl;
//if(x==pachet[mid]) ok=1;
if(x<=pachet[mid])
{
sol=mid;
dr=mid;
}
else
st=mid+1;
}
//if(ok==1) return 0;
return sol;
}
void afisare(int i)
{
if(i>0)
{
afisare(pred[i]);
fout<<v[i]<<' ';
}
}
void solve()
{
int i,j,x,nr_pachete=1,last_added=v[1];
for(i=2;i<=n;i++)
{
//cout<<nr_pachete;
if(v[i]==pachet[nr_pachete]) continue;
if(v[i]>pachet[nr_pachete])
{
pachet[++nr_pachete]=v[i];
//last_added=v[i];
pred[i]=ind[nr_pachete-1];
ind[nr_pachete]=i;
}
else
if(v[i]<=pachet[1])
{pachet[1]=v[i];
//last_added=pachet[1];
ind[1]=i;
}
else
{ x=bs(i,nr_pachete);
//cout<<v[i]<<' '<<x<<endl;
//cel mai din stanga pachet corespunzator
pachet[x]=v[i];
pred[i]=ind[x-1];
ind[x]=i;
//schimb fata pachetului cu primul element(cel vizibil din jocul de carti)
//pred[v[i]]=pachet[x-1];
}
}
fout<<nr_pachete<<'\n';
x=ind[nr_pachete];
afisare(x);
fout.close();
}
int main()
{
read();
solve();
}