Cod sursa(job #527964)

Utilizator katakunaCazacu Alexandru katakuna Data 1 februarie 2011 16:35:38
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;

#define Nmax 2010
#define MOD 111013

int n, N;
int v[Nmax], x[Nmax];
unsigned int C[Nmax], Sum[Nmax][Nmax];
vector < pair <int, int> > H[MOD + 1];

int in_hash (int val) {
	
	int nod = val % MOD;
	for (vector < pair <int, int> >::iterator it = H[nod].begin (); it != H[nod].end (); it++) {
		if (it->first == val) return it->second; 	
	}

	return 0;
}


void add_hash (int val, int poz) {
	
	H[val % MOD].push_back ( make_pair (val, poz) );
}

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

	sort (x + 1, x + n + 1);
	for (i = 1; i <= n; i++) {
		if (!in_hash (x[i])) {
			++N; add_hash (x[i], N);
		}
	}
	
	for (i = 1; i <= n; i++)
		v[i] = in_hash (v[i]);
}

void rezolva () {
	
	int i, j;
	Sum[0][v[1]]++;
	for (i = 2; i <= n; i++) {
		memset (C, 0, sizeof (C));

		for (j = 1; j < v[i]; j++) {
			C[j] = Sum[0][j];
			C[j]+= Sum[n][j] - Sum[v[i]][j];	
		}		

		C[v[i]] = Sum[0][v[i]];
		for (j = v[i] + 1; j <= n; j++) {
			C[j] = Sum[0][j];
			if (v[i] - 1 > 0) C[j]+= Sum[v[i]-1][j]; 
		}

		for (j = 1; j <= n; j++) {
			C[j]+= C[j-1];
			Sum[j][ v[i] ]+= C[j];
		}		

		Sum[0][v[i]]++;
	}

	unsigned int sol = 0;
	for (i = 1; i <= n; i++)
		sol = sol + Sum[n][i];

	printf ("%u", sol);
}

int main () {

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

	citire ();
	rezolva ();

	return 0;
}