Pagini recente » Cod sursa (job #114892) | Cod sursa (job #2793694) | Cod sursa (job #794534) | Cod sursa (job #3167298) | Cod sursa (job #570160)
Cod sursa(job #570160)
Utilizator |
roots1 roots |
Data |
2 aprilie 2011 17:45:32 |
Problema |
Secv |
Scor |
100 |
Compilator |
cpp |
Status |
done |
Runda |
105 |
Marime |
1.16 kb |
#include <stdio.h>
#include <string.h>
#include <set>
#define Dim 5005
using namespace std;
set <int> check;
int v[Dim],d[Dim],q[Dim];
int BS(int x,int L,int R)
{
if(L<=R)
{
int M=L+(R-L)/2;
if(x<q[M]) return BS(x,M+1,R);
else return BS(x,L,M-1);
}
else return L;
}
int main()
{
int i,size,N,pos,sol,dif;
freopen("secv.in","r",stdin);
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&v[i]);
check.insert(v[i]);
}
sol=check.size();
memset(d,0,sizeof(d));
memset(q,0,sizeof(q));
q[1]=v[N];
size=1;
d[N]=1;
for(i=N-1;i>0;i--)
if(q[size]>v[i])
{
size++;
q[size]=v[i];
d[i]=size;
}
else
{
pos=BS(v[i],1,size);
q[pos]=v[i];
d[i]=pos;
}
pos=-1;
for(i=1;i<=N;i++)
if(d[i]==sol)
{
pos=i;
break;
}
freopen("secv.out","w",stdout);
if(pos==-1)
{
printf("-1\n");
return 0;
}
dif=-1;
while(pos<=N)
{
if(d[pos]==sol)
{
i=pos;
size=sol;
while(i<=N&&size)
{
if(d[i]==size) size--;
i++;
}
if(dif>i-pos||dif==-1) dif=i-pos;
}
pos++;
}
printf("%d\n",dif);
return 0;
}