Cod sursa(job #67514)

Utilizator stef2nStefan Istrate stef2n Data 25 iunie 2007 10:53:22
Problema P-sir Scor 70
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.47 kb
// MOD!!!

/*
        Complexitate: O(N^2)
*/

#include <cstdio>
#include <algorithm>
using namespace std;

#define NMAX 2002
#define MOD 4294967295

int N,val[NMAX];
short int ord[NMAX];
unsigned int A[NMAX][NMAX];
unsigned int B[NMAX],C[NMAX];
short int sch[NMAX];

void read_data()
  {
   scanf("%d",&N);
   for(int i=0;i<N;i++)
      {
       scanf("%d",&val[i]);
       ord[i]=i;
      }
  }

bool cmp(short int a, short int b)
  {
   return val[a]<val[b];
  }

void solve()
  {
   int i,j,k;
   for(i=0;i<N;i++)
      {
       // init
       for(k=0;k<N;k++)
          B[k]=C[k]=A[ord[k]][i];
       for(k=1;k<N;k++)
          B[k]+=B[k-1];
       for(k=N-2;k>=0;k--)
          C[k]+=C[k+1];
       // solve
       for(j=0;j<=i;j++)
          A[i][j]=0;
       for(j=i+1;j<N;j++)
          if(val[i]<val[j])
            {
             k=sch[j]+1;
             if(k<N)
               A[i][j]=1+C[k];
             else
               A[i][j]=1;
            }
          else
            if(val[i]>val[j])
              {
               k=sch[j]-1;
               if(k>=0)
                 A[i][j]=1+B[k];
               else
                 A[i][j]=1;
              }
            else
              A[i][j]=1;
      }
  }




int main()
{
freopen("psir.in","r",stdin);
freopen("psir.out","w",stdout);

read_data();
sort(ord,ord+N,cmp);
for(int i=0;i<N;i++)
   sch[ord[i]]=i;
solve();

unsigned int cnt=0;
for(int i=0;i<N;i++)
   for(int j=i+1;j<N;j++)
      cnt+=A[i][j];
printf("%u\n",cnt);

return 0;
}