Pagini recente » Cod sursa (job #605561) | Cod sursa (job #2459988) | Cod sursa (job #2386797) | Cod sursa (job #1428788) | Cod sursa (job #68935)
Cod sursa(job #68935)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define in "psir.in"
#define out "psir.out"
#define dim 2001
int N;
vector<int> P;
unsigned B[dim][dim], C[dim][dim];
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &N);
P.resize(N);
for ( int i = 0; i < N; i++ )
{
scanf("%d", &P[i]);
}
C[1][1] = 1;
for ( int i = 0; i < N-1; i++ )
for ( int j = 0; j < N; j++ )
{
//if ( i == j ) continue;
B[i][j] = 1;
}
C[0][0] = B[0][0];
for ( int j = 1; j < N; j++ )
C[0][j] = C[0][j-1] + B[j][0];
unsigned G;
int poz;
/* for ( int i = 1; i < N-1; i++ )
for ( int j = i+1; j < N; j++ )
for ( int k = j+1; k <= N; k++ )
{
if ( (P[k]-P[i])*(P[k]-P[j]) < 0 )
{
B[j][k] += B[i][j];
}
}
unsigned t = 0;
for ( int i = 1; i <= N; i++ )
for ( int j = 1; j <= N; j++ )
{
t += B[i][j];
}*/
sort(P.begin(),P.end());
int k;
for ( int i = 0; i < N; i++ )
{
for ( int j = i+1; j < N-1; j++ )
{
k = j+1;
while ( P[j] == P[k] && k < N ) k+=1;
B[i][j] += C[i][N] - C[i][k-1];
}
C[i+1][0] = B[i+1][0];
if ( i == N-1 ) continue;
for ( int j = 1; j <= N; j++ )
C[i+1][j] = C[i+1][j-1] + B[j][i+1];
}
unsigned t=0;
for ( int i = 1; i <= N; i++ )
for ( int j = 1; j <= N; j++ )
{
t += B[i][j];
}
printf("%u", t);
}