Cod sursa(job #203205)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 14 august 2008 16:23:05
Problema Subsir 2 Scor 61
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#define NMAX 5000
#define MMAX 60000

int n,a[NMAX+1];
int m[NMAX+1],M[NMAX+1],nextm[NMAX+1],l[NMAX+1],nextM[NMAX+1];


int main(){
freopen("subsir2.in","r",stdin);
freopen("subsir2.out","w",stdout);
int i,j,lmin,ua,pua,max,min,sol[NMAX+1],k,t;
int nrf,first,vfirst;
char sir[MMAX],*p;
scanf("%d\n",&n);
//for(i=1;i<=n;++i) scanf("%d",&a[i]);
fgets(sir,MMAX,stdin);p=sir;
for(i=1;i<=n;++i){
	a[i]=atoi(p);
	while(*p!=32) ++p;
	++p;
	}
min=INT_MAX;max=INT_MIN;
for(i=1;i<=n;++i){
	if(a[i]<min) min=a[i];
	if(a[i]>max) max=a[i];
	}

if(min==max) {
	lmin=n;first=1;
	for(i=1;i<=n;++i) sol[i-1]=i;
	goto finish;
	}
if(min==a[n]) {lmin=1;first=n;sol[0]=n; goto finish;}
if(max==a[1]) {lmin=1;first=1;sol[0]=1; goto finish;}

int ales;
ales=0;
M[n]=1;
for(i=n-1;i;--i){
	lmin=0;ua=a[i];pua=i;ales=0;
	for(j=i+1;j<=n;++j)
		if(a[i]<=a[j]){
			if(!ales){
				lmin=M[j];nextM[i]=j;
				ua=a[j];pua=j;
				ales=1;
				}
			else
				if(ua>a[j])
					if(lmin>M[j]){
						lmin=M[j];nextM[i]=j;
						ua=a[j];pua=j;
						}
					else
						if(lmin==M[j]&&a[j]<ua){
							nextM[i]=j;
							ua=a[j];pua=j;
							}
				}
	M[i]=lmin+1;
	}
m[1]=1;
for(i=2;i<=n;++i){
	lmin=0;ua=a[i];pua=i;ales=0;
	for(j=i-1;j;--j)
		if(a[j]<=a[i]){
			if(!ales){
				lmin=m[j];nextm[i]=j;
				ua=a[j];pua=j;
				ales=1;
				}
			else
				if(ua<a[j])
					if(lmin>m[j]){
						lmin=m[j];nextm[i]=j;
						ua=a[j];pua=j;
						}
					else
						if(lmin==m[j]&&a[j]>ua){
							nextm[i]=j;
							ua=a[j];pua=j;
							}
				}
	m[i]=lmin+1;
	}
for(i=1;i<=n;++i) l[i]=m[i]+M[i]-1;
lmin=n;
for(i=1;i<=n;++i)
	if(lmin>l[i]) {lmin=l[i];nrf=1;}
	else if(lmin==l[i]) nrf++;
vfirst=max;
for(i=1;i<=n;++i)
	if(lmin==l[i]&&vfirst>a[i])
		{first=i;vfirst=a[i];}
i=first;k=0;sol[0]=first;k++;
while(nextm[i]){
	i=nextm[i];
	sol[k]=i;k++;
	}
for(i=0;i<k/2;++i)
	t=sol[i],sol[i]=sol[k-i-1],sol[k-i-1]=t;
i=first;
while(nextM[i]){
	sol[k++]=nextM[i];
	i=nextM[i];
	}
finish:
printf("%d\n",lmin);
for(i=0;i<lmin;++i)
	printf("%d ",sol[i]);
return 0;
}