Cod sursa(job #66731)

Utilizator dominoMircea Pasoi domino Data 20 iunie 2007 20:27:36
Problema P-sir Scor Ascuns
Compilator cpp Status done
Runda Marime 1.19 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 2048
#define FIN "psir.in"
#define FOUT "psir.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
#define mp make_pair
#define f first
#define s second

int N, P[MAX_N], nv; unsigned cnt[MAX_N][MAX_N], Res;
pair < int, unsigned >V[MAX_N];

int main (void)
{
    int i, j, k;
    unsigned sum;

    freopen (FIN, "r", stdin);
    freopen (FOUT, "w", stdout);

    scanf ("%d", &N);
    FOR (i, 0, N) scanf ("%d", P + i);

    FOR (i, 0, N)
    {
        nv = 0;
        V[nv++] = mp(0, 0);
        FOR (j, 0, i) V[nv++] = mp(P[j], cnt[j][i]);
        sort (V, V + nv);

        sum = 0;
        FOR (j, 1, nv) V[j].s += V[j - 1].s;
        sum = V[nv - 1].s;

        FOR (j, i + 1, N)
        {
            cnt[i][j] = 1;
            if (P[j] > P[i])
            {
               k = upper_bound(V, V + nv, mp(P[j], 4294967295u)) - V;
               cnt[i][j] += sum - V[k - 1].s;
            }
            if (P[j] < P[i])
            {
               k = lower_bound(V, V + nv, mp(P[j], 0u)) - V;
               cnt[i][j] += V[k - 1].s;
            }
            Res += cnt[i][j];
        }
    }

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

    return 0;
}