Pagini recente » Cod sursa (job #2269232) | Cod sursa (job #2114226) | Cod sursa (job #371332) | Cod sursa (job #254001) | Cod sursa (job #66731)
Cod sursa(job #66731)
Utilizator |
Mircea Pasoi domino |
Data |
20 iunie 2007 20:27:36 |
Problema |
P-sir |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
1.19 kb |
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAX_N 2048
#define FIN "psir.in"
#define FOUT "psir.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
#define mp make_pair
#define f first
#define s second
int N, P[MAX_N], nv; unsigned cnt[MAX_N][MAX_N], Res;
pair < int, unsigned >V[MAX_N];
int main (void)
{
int i, j, k;
unsigned sum;
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d", &N);
FOR (i, 0, N) scanf ("%d", P + i);
FOR (i, 0, N)
{
nv = 0;
V[nv++] = mp(0, 0);
FOR (j, 0, i) V[nv++] = mp(P[j], cnt[j][i]);
sort (V, V + nv);
sum = 0;
FOR (j, 1, nv) V[j].s += V[j - 1].s;
sum = V[nv - 1].s;
FOR (j, i + 1, N)
{
cnt[i][j] = 1;
if (P[j] > P[i])
{
k = upper_bound(V, V + nv, mp(P[j], 4294967295u)) - V;
cnt[i][j] += sum - V[k - 1].s;
}
if (P[j] < P[i])
{
k = lower_bound(V, V + nv, mp(P[j], 0u)) - V;
cnt[i][j] += V[k - 1].s;
}
Res += cnt[i][j];
}
}
printf ("%u\n", Res);
return 0;
}