Cod sursa(job #67725)

Utilizator victorsbVictor Rusu victorsb Data 25 iunie 2007 13:42:27
Problema P-sir Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.5 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define Nmax 2048
#define mp make_pair
#define x first
#define y second

int n;
int sir[Nmax], d[Nmax];
unsigned int s[Nmax][Nmax];
pair<int, int> p[Nmax];
unsigned int sol;

void citire()
{
    int i;
    
    scanf("%d\n", &n);
    for (i = 1; i <= n; ++i)
        scanf("%d", &sir[i]);
}

void solve()
{
    int i, j, cnt;
    long long tmp;
    
    for (i = 1; i <= n; ++i)
        d[i] = 1;
    
    for (i = 1; i <= n; ++i)
        p[i] = mp(sir[i], i);
    sort(p+1, p+n+1);
    
    sir[p[1].y] = cnt = 1;
    for (i = 2; i <= n; ++i)
    {
        if (p[i].x != p[i - 1].x) ++cnt;
        sir[p[i].y] = cnt;
    }
    
    for (i = 1; i <= n; ++i)
    {
        for (j = 1; j <= n + 1; ++j)
            s[i][j] += s[i][j - 1];
        
        for (j = i + 1; j <= n; ++j)
        {
            ++sol;
            ++s[j][sir[i]];
            
            if (sir[i] > sir[j])
            {
                s[j][sir[i]] += s[i][sir[j] - 1];
                sol += s[i][sir[j] - 1];
            }
            
            if (sir[i] < sir[j])
            {
                s[j][sir[i]] += s[i][n + 1] - s[i][sir[j]];
                sol += s[i][n + 1] - s[i][sir[j]];
            }
        }
    }
    
    tmp = sol;
    
    printf("%lld\n", tmp);
}

int main()
{
    freopen("psir.in", "r", stdin);
    freopen("psir.out", "w", stdout);
    citire();
    solve();
    return 0;
}