Pagini recente » Cod sursa (job #2862790) | Istoria paginii runda/simulare_oji_2023_clasa_10_14_martie | Cod sursa (job #587791) | Cod sursa (job #1913092) | Cod sursa (job #527964)
Cod sursa(job #527964)
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
#define Nmax 2010
#define MOD 111013
int n, N;
int v[Nmax], x[Nmax];
unsigned int C[Nmax], Sum[Nmax][Nmax];
vector < pair <int, int> > H[MOD + 1];
int in_hash (int val) {
int nod = val % MOD;
for (vector < pair <int, int> >::iterator it = H[nod].begin (); it != H[nod].end (); it++) {
if (it->first == val) return it->second;
}
return 0;
}
void add_hash (int val, int poz) {
H[val % MOD].push_back ( make_pair (val, poz) );
}
void citire () {
int i;
scanf ("%d", &n);
for (i = 1; i <= n; i++) {
scanf ("%d", &x[i]);
v[i] = x[i];
}
sort (x + 1, x + n + 1);
for (i = 1; i <= n; i++) {
if (!in_hash (x[i])) {
++N; add_hash (x[i], N);
}
}
for (i = 1; i <= n; i++)
v[i] = in_hash (v[i]);
}
void rezolva () {
int i, j;
Sum[0][v[1]]++;
for (i = 2; i <= n; i++) {
memset (C, 0, sizeof (C));
for (j = 1; j < v[i]; j++) {
C[j] = Sum[0][j];
C[j]+= Sum[n][j] - Sum[v[i]][j];
}
C[v[i]] = Sum[0][v[i]];
for (j = v[i] + 1; j <= n; j++) {
C[j] = Sum[0][j];
if (v[i] - 1 > 0) C[j]+= Sum[v[i]-1][j];
}
for (j = 1; j <= n; j++) {
C[j]+= C[j-1];
Sum[j][ v[i] ]+= C[j];
}
Sum[0][v[i]]++;
}
unsigned int sol = 0;
for (i = 1; i <= n; i++)
sol = sol + Sum[n][i];
printf ("%u", sol);
}
int main () {
freopen ("psir.in", "r", stdin);
freopen ("psir.out", "w", stdout);
citire ();
rezolva ();
return 0;
}