Cod sursa(job #74564)

Utilizator sealTudose Vlad seal Data 26 iulie 2007 10:58:30
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#include<stdlib.h>
#define Nm 2002
int A[Nm],n;
unsigned M[Nm][Nm],ans;

void read()
{
    int i;

    freopen("psir.in","r",stdin);
    scanf("%d",&n);
    for(i=0;i<n;++i)
        scanf("%d",A+i);
}

int cmp(const void *a, const void *b)
{
    if(A[*(int*)a]<A[*(int*)b])
        return -1;
    return A[*(int*)a]>A[*(int*)b];
}

void solve()
{
    int I[Nm],i,j,k;

    for(i=0;i<n;++i)
        I[i]=i;
    qsort(I,n,sizeof(int),cmp);
    j=A[I[0]]; A[I[0]]=k=1;
    for(i=1;i<n;++i)
        if(A[I[i]]==j)
            A[I[i]]=k;
        else
        {
            j=A[I[i]];
            A[I[i]]=++k;
        }

    for(i=1;i<n;++i)
    {
        for(j=0;j<i;++j)
            if(A[j]==A[i])
                ++ans;
            else
                if(A[j]<A[i])
                    M[i][A[j]]+=1+M[j][A[i]+1];
                else
                    M[i][A[j]]+=1+M[j][A[i]-1];

        for(j=2;j<A[i];++j)
            M[i][j]+=M[i][j-1];
        for(j=k-1;j>A[i];--j)
            M[i][j]+=M[i][j+1];
        ans+=M[i][A[i]-1]+M[i][A[i]+1];
    }
}

void write()
{
    freopen("psir.out","w",stdout);
    printf("%u\n",ans);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}