Cod sursa(job #463601)

Utilizator GotenAmza Catalin Goten Data 16 iunie 2010 16:27:36
Problema P-sir Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
using namespace std;
unsigned int h[2010],b[2010],a[2010],m[2010][2010],start[2010],sum[2010],res;
unsigned int i,j,n,nr=0,t,u;
bool ok;
int cmp(int i, int j)
{
	return a[i]<a[j];
}
int main()
{
	ifstream read ("psir.in");
	ofstream write ("psir.out");
	read>>n;
	for(i=1;i<=n;++i)
	{
		read>>a[i];
		h[i]=i;
	}
	sort(h+1,h+n+1,cmp);
	i=1;
	while(i<=n)
	{
		start[++nr]=i;
		j=i;
		while(a[h[i]]==a[h[i+1]])
			++i;
		for(t=j;t<=i;++t)
			b[h[t]]=nr;
		++i;
	}
	start[nr+1]=n+1;
	for(i=1;i<n;++i)
	{
		t=start[b[i]+1];
		ok=0;
		while(!ok&&t<=n)
		{
			if(h[t]>i)
				ok=1;
			else
				++t;
		}
		if(ok)
		{
			for(j=1;j<i;++j)
				if(a[j]>a[h[t]])
					m[i][h[t]]+=m[j][i];
			for(j=t+1;j<=n;++j)
			{
				m[i][h[j]]=m[i][h[j-1]];
				if(a[h[j]]!=a[h[j-1]])
					for(u=start[b[h[j]]];u<start[b[h[j+1]]];++u)
						if(h[u]<i)
							m[i][h[j]]-=m[h[u]][i];
			}
		}
		t=start[b[i]]-1;
		ok=0;
		while(!ok&&t)
		{
			if(h[t]>i)
				ok=1;
			else
				--t;
		}
		if(ok)
		{
			for(j=1;j<i;++j)
				if(a[j]<a[h[t]])
					m[i][h[t]]+=m[j][i];
			for(j=t-1;j;--j)
			{
				m[i][h[j]]=m[i][h[j+1]];
				if(a[h[j]]!=a[h[j+1]])
					for(u=start[b[h[j]]];u<start[b[h[j+1]]];++u)
						if(h[u]<i)
							m[i][h[j]]-=m[h[u]][i];
			}
		}
		for(j=i+1;j<=n;++j)
			++m[i][j];
	}
	for(i=1;i<n;++i)
		for(j=i+1;j<=n;++j)
			res+=m[i][j];
	write<<res<<'\n';
	return 0;
}