Cod sursa(job #2531074)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 25 ianuarie 2020 17:17:22
Problema P-sir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb

#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 2050

using namespace std;

int n;
unsigned int din[MAXN][MAXN], pre[MAXN], a[MAXN];
struct elem
{
    unsigned int val;
    int ind;
    bool operator()(elem e, elem f)
    {
        return e.val < f.val;
    }
}p[MAXN];

int src(int val) /// binary search val in p
{
    int step, to = 0;
    for (step = 1; step <= n; step <<= 1);
    for (step; step; step >>= 1)
        if (to + step <= n && p[to+step].val <= val)
            to += step;
    return to;
}


void solve()
{
    unsigned int rez = 0;
    //for (int i = 2; i <= n; i++)
        //din[1][i] = 1, rez++;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            pre[j] = pre[j-1] + din[p[j].ind][i];
        }
        for (int j = i+1; j <= n; j++) {
            din[i][j] = 1;
            if (a[i] < a[j])
                din[i][j] += pre[n] - pre[src(a[j])];
            else if (a[i] > a[j])
                din[i][j] += pre[src(a[j]-1)];
            rez += din[i][j];
        }
    }
    printf("%u\n", rez);
}

int main()
{
    freopen("psir.in", "r", stdin);
    freopen("psir.out", "w", stdout);

    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%u", &a[i]);
        p[i].val = a[i];
        p[i].ind = i;
    }
    sort(p+1, p+1+n, elem());
    solve();

    return 0