Cod sursa(job #71295)

Utilizator wefgefAndrei Grigorean wefgef Data 9 iulie 2007 23:37:26
Problema P-sir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

#define pb push_back
#define sz size()
#define all(v) (v).begin(), (v).end()

#define Nmax 2048

int n;
int v[Nmax];

unsigned int c[Nmax][Nmax];
unsigned int ret;

map<int, int> H;
int Label[Nmax];

void readdata()
{
	freopen("psir.in", "r", stdin);
	freopen("psir.out", "w", stdout);

	scanf("%d", &n);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &v[i]);
}

void normalizeaza()
{
	int i;
	vector<int> u;

	for (i = 1; i <= n; ++i)
		u.pb(v[i]);

	sort(all(u));
	u.resize( unique(all(u)) - u.begin() );

	for (i = 0; i < (int)u.sz; ++i)
		H[ u[i] ] = i+1;

	for (i = 1; i <= n; ++i)
		Label[i] = H[ v[i] ];
}

void solve()
{
	int i, j;

	normalizeaza();

	for (i = 2; i <= n; ++i)
	{
		for (j = 1; j < i; ++j)
		{
			c[i][ Label[j] ]++;

			if (v[i] < v[j])
				c[i][ Label[j] ] += c[j][ Label[i]-1 ];

			if (v[i] > v[j])
				c[i][ Label[j] ] += c[j][ H.sz ] - c[j][ Label[i] ];
		}

		for (j = 1; j <= H.sz; ++j)
			ret += c[i][j];

		for (j = 2; j <= H.sz; ++j)
				c[i][j] += c[i][j-1];
	}
	printf("%d\n", ret);
}

int main()
{
	readdata();
	solve();
	return 0;
}