Pagini recente » Cod sursa (job #1511352) | Cod sursa (job #907837) | Cod sursa (job #2131083) | Cod sursa (job #741418) | Cod sursa (job #66726)
Cod sursa(job #66726)
Utilizator |
Mircea Pasoi domino |
Data |
20 iunie 2007 20:19:13 |
Problema |
P-sir |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
1.26 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, int >V[MAX_N];
int main (void)
{
int i, j, k, k1, k2;
unsigned s1, s2;
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d", &N);
FOR (i, 0, N) scanf ("%d", P + i);
FOR (i, 0, N) V[i] = mp (P[i], i);
sort (V, V + N);
FOR (i, 0, N)
{
k1 = s1 = 0;
k2 = s2 = 0;
FOR (k, 0, i) s2 += cnt[k][i];
FOR (j, 0, N)
{
if (V[j].s <= i) continue;
cnt[i][V[j].s] = 1;
if (V[j].f < P[i])
{
for (; k1 < N && V[k1].f < V[j].f; k1++)
if (V[k1].s < i) s1 += cnt[V[k1].s][i];
cnt[i][V[j].s] += s1;
}
if (V[j].f > P[i])
{
for (; k2 < N && V[k2].f <= V[j].f; k2++)
if (V[k2].s < i) s2 -= cnt[V[k2].s][i];
cnt[i][V[j].s] += s2;
}
Res += cnt[i][V[j].s];
}
}
printf ("%u\n", Res);
return 0;
}