Pagini recente » Monitorul de evaluare | Istoria paginii runda/ms98 | Cod sursa (job #677066) | Cod sursa (job #330139) | Cod sursa (job #2158032)
// facem varianta de 70 de pt cu programare dinamica.
// am revenit si am o varianta de 100 cu cautare binara.
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int lng,n,i,j,nr,mx,v[100005],f[100005];
vector<int> tail;
int cbin(int k)
{
int st=1,dr=lng,m=0;
while(st<=dr)
{
m=st+(dr-st)/2;
if(tail[m]>=k) dr=m-1;
else st=m+1;
}
if(tail[m]<k) m++;
return m;
}
int main () {
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
tail.push_back(v[1]);
lng=0;
for(i=2;i<=n;i++)
{
if(v[i]<=tail[0]) tail[0]=v[i];
else if(v[i]>tail[lng])
{
tail.push_back(v[i]);
lng++;
}
else tail[cbin(v[i])]=v[i];
}
fout<<lng+1<<"\n";
for(i=0;i<=lng;i++)
fout<<tail[i]<<" ";
}