Pagini recente » Cod sursa (job #1820686) | Cod sursa (job #1045560) | Cod sursa (job #2694823) | Cod sursa (job #2395777) | Cod sursa (job #2438460)
//Patience-LIS
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<string.h>
#define nmax 100001
using namespace std;
int v[nmax],pachet[nmax],pred[nmax];
int n;
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));
pachet[1]=v[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 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[nr_pachete]]=nr_pachete-1;
}
else
if(v[i]<=pachet[1])
{pachet[1]=v[i];
//last_added=pachet[1];
}
else
{ x=bs(i,nr_pachete);
//cout<<v[i]<<' '<<x<<endl;
//cel mai din stanga pachet corespunzator
pachet[x]=v[i];
//schimb fata pachetului cu primul element(cel vizibil din jocul de carti)
//pred[v[i]]=pachet[x-1];
}
}
ofstream fout("scmax.out");
fout<<nr_pachete<<'\n';
for(i=1;i<=nr_pachete;i++)
fout<<pachet[i]<<' ';
fout.close();
}
int main()
{
read();
solve();
}