Pagini recente » Cod sursa (job #1683469) | Cod sursa (job #3163040) | Cod sursa (job #2022491) | Cod sursa (job #2904865) | Cod sursa (job #66725)
Cod sursa(job #66725)
Utilizator |
Mircea Pasoi domino |
Data |
20 iunie 2007 20:17:51 |
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], MOD)) - V;
cnt[i][j] += sum - V[k - 1].s;
}
if (P[j] < P[i])
{
k = upper_bound (V, V + nv, mp (P[j], -1)) - V;
cnt[i][j] += V[k - 1].s;
}
Res += cnt[i][j];
}
}
printf ("%u\n", Res);
return 0;
}