Cod sursa(job #197045)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 30 iunie 2008 22:53:39
Problema P-sir Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define maxn 2010
#define ui unsigned int

int n;
ui sol;
int a[maxn], p[maxn];
ui c[maxn];
ui s[maxn][maxn];
ui sum[maxn];

int cmp(int x, int y)
{
	return a[x] < a[y];
}

int main()
{
	freopen("psir.in", "r", stdin);
	freopen("psir.out", "w", stdout);

	scanf("%d ", &n);

	int i, j, k;

	for (i=1; i<=n; i++) 
	{
		scanf("%d ", &a[i]);
		p[i] = i;
	}

	sort(p+1, p+n+1, cmp);

	for (i=1; i<=n; i++) 
		if (a[p[i]] == a[p[i-1]]) a[p[i]] = a[p[i-1]];
		else a[p[i]] = i;

	for (i=2; i<=n; i++) 
	{
		memset(c, 0, sizeof(c));

		for (j=1; j<i; j++) 
		{
			if (a[j] > a[i]) c[j] =	s[j][a[i]-1] + 1;
			else c[j] = sum[j] - s[j][a[i]] + 1;

			sum[i] += c[j];
		}

		k = 1;

		for (j=1; j<=n; j++) 
		{
			s[i][j] = s[i][j-1];
			for (; k<=n && a[p[k]]==j; k++) 
				if (p[k] < i) s[i][j] += c[p[k]];
		}

		sol += sum[i];
	}

	printf("%u\n", sol);

	return 0;
}