Cod sursa(job #67854)

Utilizator sealTudose Vlad seal Data 25 iunie 2007 18:40:10
Problema P-sir Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<stdio.h>
#include<stdlib.h>
#define Nm 2001
int P[Nm],n;
unsigned Nr[Nm][Nm],sol;

void read()
{
    int i;

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

int cmp1(const void *x, const void *y)
{
    return P[*(int*)x]-P[*(int*)y];
}

int cmp2(const void *x, const void *y)
{
    return P[*(int*)y]-P[*(int*)x];
}

void solve()
{
    int A[Nm],AA[Nm],B[Nm],BB[Nm],i,j,nra,nrb,nraa,nrbb;
    unsigned Mod=4294967295u,sa,sb;

    for(j=n-1;j;--j)
    {
        nra=nrb=sa=sb=0;
        for(i=j+1;i<=n;++i)
        {
            Nr[j][i]=((long long)Nr[j][i]+1)&Mod;
            if(P[i]>P[j])
            {
                A[nra++]=i;
                sa=((long long)sa+Nr[j][i])&Mod;
            }
            else
                if(P[i]<P[j])
                {
                    B[nrb++]=i;
                    sb=((long long)sb+Nr[j][i])&Mod;
                }
        }
        qsort(A,nra,sizeof(int),cmp1);
        qsort(B,nrb,sizeof(int),cmp2);
        nraa=nrbb=0;
        for(i=1;i<j;++i)
            if(P[i]>P[j])
                AA[nraa++]=i;
            else
                if(P[i]<P[j])
                    BB[nrbb++]=i;
        qsort(AA,nraa,sizeof(int),cmp2);
        qsort(BB,nrbb,sizeof(int),cmp1);
        for(i=0;i<nraa;++i)
        {
            while(nra && P[A[nra-1]]>P[AA[i]])
            {
                --nra;
                sa-=Nr[j][A[nra]];
                if(sa<0)
                    sa+=Mod;
            }
            Nr[AA[i]][j]=((long long)Nr[AA[i]][j]+sa)&Mod;
        }
        for(i=0;i<nrbb;++i)
        {
            while(nrb && P[B[nrb-1]]<P[BB[i]])
            {
                --nrb;
                sb-=Nr[j][B[nrb]];
                if(sb<0)
                    sb+=Mod;
            }
            Nr[BB[i]][j]=((long long)Nr[BB[i]][j]+sb)&Mod;
        }
    }

    for(i=1;i<=n;++i)
        for(j=i+1;j<=n;++j)
            sol=((long long)sol+Nr[i][j])&Mod;
}

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

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