Cod sursa(job #73989)

Utilizator astronomyAirinei Adrian astronomy Data 23 iulie 2007 11:57:36
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define MAX_N 2048

int N, S[MAX_N], V[MAX_N];
unsigned A[MAX_N][MAX_N], res;

void solve(void)
{
    int i, j;

    for(i = 2; i <= N; i++)
    {
        for(j = i-1; j >= 1; j--)
        {
            if(S[i] == S[j])
                continue ;
            A[i][S[j]]++;
            if(S[i] < S[j])
                A[i][S[j]] += A[j][S[i]-1];
            else
                A[i][S[j]] += A[j][N]-A[j][S[i]];
        }
        for(j = 1; j <= N; j++)
            A[i][j] += A[i][j-1];
        res += A[i][N];
    }

    for(i = 1; i <= N; i++)
     for(j = i+1; j <= N; j++)
      if(S[i] == S[j])
        res++;
}

void read_data(void)
{
    int i, st, dr, m, r;

    scanf("%d\n", &N);

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

    sort(V+1, V+N+1);

    for(i = 1; i <= N; i++)
    {
        st = 1, dr = N;
        while(st <= dr)
        {
            m = (st+dr) >> 1;
            if(V[m] <= S[i])
                r = m, st = m+1;
            else
                dr = m-1;
        }
        S[i] = r;
    }
}

void write_data(void)
{
    printf("%u\n", res);
}

int main(void)
{
    freopen("psir.in", "rt", stdin);
    freopen("psir.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}