Cod sursa(job #493912)

Utilizator CezarMocanCezar Mocan CezarMocan Data 19 octombrie 2010 21:01:01
Problema P-sir Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <algorithm>

const int maxN = 2010;

using namespace std;

unsigned int N;
int V[maxN], sorted[maxN], norm[maxN];
unsigned int D[maxN][maxN];
unsigned int aib[maxN][maxN];

inline unsigned int lsb(unsigned int x) {
	return ((x & (x - 1)) ^ x);
}

inline void update(unsigned int a, unsigned int poz, unsigned int val) {
	unsigned int i;
	for (i = poz; i <= N; i += lsb(i)) 
		aib[a][i] += val;
}

inline unsigned int query(unsigned int a, unsigned int poz) {
	unsigned int i, ret = 0;
	for (i = poz; i > 0; i -= lsb(i))
		ret += aib[a][i];
	return ret;
}

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

	scanf("%d", &N);
	for (i = 1; i <= N; i++) {
		scanf("%d", &V[i]);
		sorted[i] = V[i];
	}

	sort(sorted + 1, sorted + N + 1);
	for (i = 1; i <= N; i++)
		for (j = 1; j <= N; j++)
			if (sorted[j] == V[i]) {
				norm[i] = j;
				break;
			}

	for (i = 1; i <= N; i++)
		D[0][i] = 1;

	for (i = 1; i <= N; i++) {
		for (j = i + 1; j <= N; j++) {
/*			if (V[j] - V[i] < 0) {
//				fprintf(stderr, "pula\n");
				D[i][j] = query(i, norm[j] - 1);
//				fprintf(stderr, "Q aib = %d, poz = %d, val = %d\n", i, norm[j] - 1, D[i][j]);
			}
			else
				D[i][j] = query(i, N) - query(i, norm[j]);
*/
			for (k = 1; k < i; k++)
				if (((V[j] - V[i]) * (V[j] - V[k]) < 0)) {
					D[i][j] += D[k][i];
//					fprintf(stderr, "(%d, %d) += (%d, %d)   ->   %d\n", i, j, k, i, D[i][j]);
				}
			D[i][j]++;
//			update(j, norm[i], D[i][j]);
//			fprintf(stderr, "U aib = %d, poz = %d, val = %d\n", j, norm[i], D[i][j]);
		}
	}

	int sol = 0;
	for (i = 1; i <= N; i++)
		for (j = i + 1; j <= N; j++)
			sol += D[i][j];

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

	return 0;
}