Cod sursa(job #751458)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 mai 2012 10:05:54
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <algorithm>

using namespace std;

const char InFile[]="psir.in";
const char OutFile[]="psir.out";
const int MaxN=2048;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,V[MaxN],VN[MaxN];
unsigned int PSUM[MaxN][MaxN];

inline int Search(int val)
{
	int first=1;
	for(int step=MaxN;step;step>>=1)
	{
		int index=first+step;
		if(index<=VN[0])
		{
			if(VN[index]<=val)
			{
				first=index;
			}
		}
	}
	return first;
}

int main()
{
	fin>>N;
	for(register int i=1;i<=N;++i)
	{
		fin>>V[i];
		VN[i]=V[i];
	}
	fin.close();

	sort(VN+1,VN+1+N);
	VN[0]=1;
	for(register int i=2;i<=N;++i)
	{
		if(VN[i]!=VN[VN[0]])
		{
			VN[++VN[0]]=VN[i];
		}
	}

	for(register int i=1;i<=N;++i)
	{
		V[i]=Search(V[i]);
	}

	unsigned int sol=0;
	for(register int i=2;i<=N;++i)
	{ 
		for(register int j=1;j<i;++j)
		{
			unsigned int curr=1;
			if(V[i]<V[j])
			{
				curr+=PSUM[j][V[i]-1];
			}
			else if(V[i]>V[j])
			{
				curr+=PSUM[j][VN[0]]-PSUM[j][V[i]];
			}
			PSUM[i][V[j]]+=curr;
			sol+=curr;
		}

		for(register int j=1;j<=VN[0];++j)
		{
			PSUM[i][j]+=PSUM[i][j-1];
		}
	}

	fout<<sol;
	fout.close();
	return 0;
}