Cod sursa(job #844965)

Utilizator stoicatheoFlirk Navok stoicatheo Data 30 decembrie 2012 00:58:42
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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;
}