Cod sursa(job #578071)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 10 aprilie 2011 22:36:05
Problema P-sir Scor 100
Compilator cpp Status done
Runda pregatire_oni2011_runda3 Marime 1.27 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define Nmx 2006

using namespace std;

int n,Poz[Nmx],D[Nmx];
unsigned sol,Rez[Nmx][Nmx];
struct dat{int v, pz;}A[Nmx];

struct cmp
{
    bool operator () ( const dat &a,const dat &b) const
    {
        return a.v<b.v;
    }
};

void read()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
         scanf("%d",&A[i].v);
         A[i].pz=i;
    }
}

void solve()
{
    int p;
    sort(A+1,A+n+1,cmp());
    p = 0;
    for(int i=1;i<=n;i++)
    {
         if(A[i].v!=A[i-1].v)
              p++;
         Poz[A[i].pz]=p;
    }
    for(int i=1; i<=n; i++) {
         memset(D,0,sizeof(D));
         for(int j=1;j<Poz[i]; j++)
              D[j]=D[j]+Rez[j][n]-Rez[j][Poz[i]];
         for(int j=Poz[i]+1;j<=n;j++)
              D[j]=D[j]+Rez[j][Poz[i]-1];
         for(int j=1;j<i;j++)
              D[Poz[j]]=D[Poz[j]]+1;
         for(int j=1;j<=n;j++)
         {
              D[j]=(D[j]+D[j-1]);
              Rez[Poz[i]][j]=Rez[Poz[i]][j]+D[j];
         }
    }
}

int main()
{
    freopen("psir.in","r",stdin);
    freopen("psir.out","w",stdout);
    read();
    solve();
    for(int i=1;i<=n;i++)
         sol=(sol+Rez[i][n]);
    printf("%u\n",sol);
    return 0;
}