Cod sursa(job #69000)

Utilizator cos_minBondane Cosmin cos_min Data 30 iunie 2007 16:34:34
Problema P-sir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
using namespace std;

#define in "psir.in"
#define out "psir.out"
#define dim 2001

int N;
long long P[dim], D[dim];
unsigned B[dim][dim], C[dim];

void Qsort(int,int);

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d", &N);
    for ( int i = 1; i <= N; i++ )
        scanf("%lld", &D[i]), P[i] = D[i]; 
    
    Qsort(1,N);
    
    for ( int i = 1; i < N; i++ )
        for ( int j = i+1; j <= N; j++ )
            B[j][i] = 1;
    
    C[0] = 0;
    
    for ( int j = 1; j <= N; j++ )
        C[j] = C[j-1] + B[j][1];
    
    for ( int i = 1; i < N-1; i++ )
    {
        for ( int j = i+1; j < N; j++ )
        {
            int k = j+1;
            while ( P[j] == P[k] && k <= N ) k += 1;
            
            B[i][j] += C[N] - C[k-1]; 
        } 
        
        C[0] = 0;
        for ( int j = i+1; j <= N; j++ )
        {
            C[j] = C[j-1] + B[j][i];
        }
    }
    
    unsigned t=0;
    
     for ( int i = 1; i < N; i++ )
        for ( int j = i+1; j <= N; j++ )
            t += B[i][j];
     
     printf("%u", t);
    
}

void Qsort(int st, int dr)
{
     int i = st-1, j = dr+1;
     int pivot = P[st];
     
     while ( i <= j ) 
     {
           do { i++; } while ( P[i] < pivot );
           do { j--; } while ( P[j] > pivot );
           if ( i <= j )
           {
                int aux;
                aux = P[i], P[i] = P[j], P[j] = aux;
           }
     }
     
     if ( st < j ) Qsort(st,j);
     if ( i < dr ) Qsort(i,dr);
}