Pagini recente » Cod sursa (job #3136663) | Cod sursa (job #1893131) | Cod sursa (job #2355191) | Cod sursa (job #1197863) | Cod sursa (job #68119)
Cod sursa(job #68119)
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;
}