Cod sursa(job #67883)

Utilizator mastermageSchneider Stefan mastermage Data 25 iunie 2007 19:41:18
Problema P-sir Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <stdio.h>

#define maxN 2010
#define fo(i,n) for(int i=0;i<n;i++)

int n,vec[maxN],res,*din[maxN],*ref[maxN];
int ss[maxN],k;
/*
int cautS(int*v,int n,int x){
	int st=0,en=n-1,m;
	while(st<en){
		m=st+en>>1;
		if(x<=v[m])en=m;else st=m+1;
	}
	while(en>=0 && v[en]>=x)en--;
	return en;
}
*/
int cautD(int*v,int n,int x){if(!n)return -1;
	int st=0,en=n-1,m;
	while(st<en){
		m=st+en>>1;
		if(x<=v[m])en=m;else st=m+1;
	}
	while(st<n-1 && v[st]==x)st++;
	while(st>=0 && v[st]>x)st--;
	
	return st;
}

int cautS(int*v,int n,int x){
	int st=0,en=n-1,m;
	
	while(st<en){
		m=st+en>>1;
		if(x<=v[m])en=m;else st=m+1;
	}
	while(en>=0 && v[en]>=x)en--;
	return en;
}
/*
int cautD(int*v,int n,int x){
	int st=0,en=n-1,m;
	
	while(st<en){
		m=st+en;m=(m>>1)+(m&1);
		if(x<v[m])en=m-1;else st=m;
	}
	
	while(en>=0 && v[en]>x)en--;
	return en;
}
*/
void ins(int p){int i,j,x=vec[p];for(i=0;i<k && vec[ss[i]]<=x ;i++);for(j=k++;j>i;j--)ss[j]=ss[j-1];ss[i]=p;}
void inputFunc(){FILE*fi=fopen("psir.in","r");fscanf(fi,"%d",&n);for(int i=0;i<n;i++)fscanf(fi,"%d",vec+i);fclose(fi);}void outputFunc(){FILE*fi=fopen("psir.out","w");fprintf(fi,"%u",res);fclose(fi);}

int main(){
	inputFunc();
	
	ins(0);
	
	for(int i=1;i<n;i++){
		int cur=vec[i];
		din[i]=new int[i],ref[i]=new int[i];
		
		fo(j,i){
			int g=ss[j],qs=cautS(ref[g],g,cur),qd=cautD(ref[g],g,cur), dref=vec[g];
			din[i][j]=1,ref[i][j]=dref;
			if(cur<dref){
				if(qs>=0)din[i][j]+=din[g][qs];
			}else
			if(cur>dref){
				if(g)din[i][j]+=din[g][g-1];
				if(qs>=0)din[i][j]-=din[g][qd];
			}
			
			if(j)din[i][j]+=din[i][j-1];
		}
		
		res+=din[i][i-1];
		ins(i);
	}
	
	
	outputFunc();
	return 0;
}