Cod sursa(job #2759791)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 20 iunie 2021 15:00:00
Problema P-sir Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("psir.in");
ofstream fout("psir.out");

const int nmax = 2005;
int n, v[nmax];
unsigned int dp[nmax][nmax], ans, sum[nmax][nmax];

int main(){
    fin >> n;
    vector <int> norm;
    for (int i = 1; i <= n; ++i){
        fin >> v[i];
        norm.push_back(v[i]);
    }
    sort(norm.begin(), norm.end());
    unordered_map <int, int> fr;
    int z = 1;
    fr[norm[0]] = z;
    for (int i = 1; i < norm.size(); ++i){
        if (norm[i] != norm[i - 1]){
            ++z;
        }
        fr[norm[i]] = z;
    }
    for (int j = 1; j <= n; ++j){
        for (int k = j - 1; k >= 1; --k){
            sum[fr[v[k]]][j] += dp[k][j];
        }
        for (int i = 1; i <= z; ++i){
            sum[i][j] += sum[i - 1][j];
        }
        for (int i = j + 1; i <= n; ++i){
            dp[j][i] = 1;
            if (v[j] < v[i]){
                dp[j][i] += (sum[z][j] - sum[fr[v[i]]][j]);
            }
            else if (v[j] > v[i]){
                dp[j][i] += sum[fr[v[i]] - 1][j];
            }
            ans += dp[j][i];
        }
    }
    fout << ans;
    return 0;
}