Cod sursa(job #1699443)

Utilizator sucureiSucureiRobert sucurei Data 7 mai 2016 12:18:29
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;

#define Nmax 2010
#define MOD 11013

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;
}