Cod sursa(job #68119)

Utilizator ZeusCatalin Tiseanu Zeus Data 26 iunie 2007 15:40:31
Problema P-sir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.04 kb

using namespace std;

#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>

int N, B[2010], A[2010];
unsigned int T[2010][2010], UP[2010];

int main()
{
    freopen("psir.in", "r", stdin);
    freopen("psir.out", "w", stdout);
    
    int res = 0;
    
    scanf("%d", &N);
    for( int i = 1; i <= N; i++ )
         scanf("%d", &B[i] ),
         A[i] = B[i];
         
    set<int> s( B + 1, B + N + 1 );
    vector<int> v( s.begin(), s.end() );
    
    long long msk = (1LL<<32) - 1;
    
    for( int i = 1; i <= N; i++ ) // a' la Chuck Norris
    {
         for( int j = 0; j < (int)v.size(); ++j )
         {
              if( v[j] == A[i] )
              {
                  A[i] = j + 1;
                  break;   
              }  
         }
    }     
    
    for( int i = 1; i <= N; ++i )
         printf("%d ", A[i] ); printf("\n");
/*    
    for( int i = 2; i <= N; i++ )
    {
         // A[i] = x
         
         for( int j = 1; j < i; ++j )
              T[i][ A[j] ] = ( (long long)( T[i][ A[j] ] ) + 1 ) & msk;  
         
         for( int j = 1; j < i; ++j)
         if( A[i] != A[j] )
         {
              // A[j] = y;
         
              if( A[i] < A[j] )
                  T[i][ A[j] ] = ( (long long)( T[i][ A[j] ] ) + (1LL<<32) + UP[ j ][ 1 ] - UP[ j ][ A[i] ] ) & msk;     
              else
                  T[i][ A[j] ] = ( (long long)( T[i][ A[j] ] ) + UP[ j ][ A[i] + 1 ] ) & msk;  
         }     
         
         UP[ i ][ 2000 ] = T[ i ][ 2000 ];
         for( int j = 1999; j >= 1; j-- )
              UP[ i ][ j ] = ( (long long)(UP[ i ][ j + 1 ]) + T[ i ][ j ] ) & msk;
              
//         printf(" UP[%d] = %d\n", i, UP[i][1] );     
              
         res = (  (long long)( res ) + UP[ i ][ 1 ] ) & msk;     
    }
*/

    for( int j = 1; j < N; j++ )
    {
         // A[j] = y
         
         UP[ 2000 ] = T[ j ][ 2000 ];
         for( int i = 1999; i >= 1; i-- )
              UP[ i ] = ( (long long)(UP[ i + 1 ]) + T[ j ][ i ] ) & msk;
         
         for( int i = j + 1; i <= N; ++i )
              T[i][ A[j] ] = ( (long long)( T[i][ A[j] ] ) + 1 ) & msk;  
         
         for( int i = j + 1; i <= N; ++i)
         if( A[i] != A[j] )
         {
              // A[j] = y;
         
              if( A[i] < A[j] )
                  T[i][ A[j] ] = ( (long long)( T[i][ A[j] ] ) + (1LL<<32) + UP[ 1 ] - UP[ A[i] ] ) & msk;     
              else
                  T[i][ A[j] ] = ( (long long)( T[i][ A[j] ] ) + UP[ A[i] + 1 ] ) & msk;  
         }                   
//         printf(" UP[%d] = %d\n", i, UP[i][1] );     
              
         res = (  (long long)( res ) + UP[ 1 ] ) & msk;     
    }
    
    for( int i = 1; i <= 2000; i++ )
         res = (  (long long)( res ) + T[N][i] ) & msk;   
/*    
    for( int i = 2; i <= N; i++ )
         for( int j = 1; j < i; ++j )
              printf(" T[%d][%d] = %d\n", j, i , T[i][j] );
*/    
    printf("%d\n", res );
    
    return 0;    
}