Cod sursa(job #202353)

Utilizator filipbFilip Cristian Buruiana filipb Data 7 august 2008 16:11:25
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#include <set>

using namespace std;

#define NMax 2005

int N, v[NMax], norm[NMax], h = 0;
unsigned int SUM[NMax][NMax], X[NMax], cnt = 0;
set<int> A;

int BS(int X)
{
    int l, r, m;

    l = 1; r = h;
    while (l <= r)
    {
        m = (l + r) / 2;
        if (norm[m] < X) l = m+1;
        else if (norm[m] > X) r = m-1;
        else return m;
    }

    return -1; // should never arrive here
}

int main(void)
{
    int i, j;
    set<int>::iterator it;
    
    freopen("psir.in", "r", stdin);
    freopen("psir.out", "w", stdout);

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

    for (i = 1; i <= N; i++)
        A.insert(v[i]);

    for (it = A.begin(); it != A.end(); it++)
        norm[++h] = *it;

    for (i = 1; i <= N; i++)
        v[i] = BS(v[i]);

    for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= N; j++) X[j] = 0;
        
        for (j = 1; j < i; j++)
            X[v[j]]++;
        
        for (j = 1; j < v[i]; j++)
            X[j] += SUM[N][j] - SUM[v[i]][j];
        
        for (j = v[i]+1; j <= N; j++)
             X[j] += SUM[v[i]-1][j];

        for (j = 1; j <= N; j++)
            X[j] += X[j-1];

        // actualizam
        for (j = 1; j <= N; j++)
            SUM[j][v[i]] += X[j];
    }

    for (i = 1; i <= N; i++)
        cnt += SUM[N][i];
        
    printf("%u\n", cnt);


    return 0;
}