Cod sursa(job #2984820)

Utilizator oskar01oskar the boss oskar01 Data 24 februarie 2023 23:17:49
Problema P-sir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 2000 + 123;
uint32_t dp[NMAX][NMAX];
// dp[i][j] = numar de p-subsiruri care au ultimul element v[i] si penultimul element are valoarea j

int main() {
    int n; cin >> n;
    vector<int> v(n); for(auto &e : v) cin >> e;
    map<int, int> norm; for(auto e : v) norm[e] = 1;
    { int cnt = 1; for(auto &e : norm) e.second = cnt++; }
    for(auto &e : v) e = norm[e];

    uint32_t rasp = 0;
    for(int i = 0; i < n; i++) { // calculam linia i, cu valoarea a[i]
        for(int j = 0; j < i; j++) { // incercam sa facem dp[i][v[j]] cu ultimele doua elemente {..., v[j], v[i]}
            uint32_t cnt = 1; // numar de p-subsiruri care se termina cu {..., v[j], v[i]}
            // initial cnt = 1 fiindca doar {v[j], v[i]} = p-subsir (e de lungime 2)

            if(v[i] > v[j]) {
                // putem sa continuam subsiruri de forma {..., x, v[j]} (numarate in dp[j][x]) cu {v[i]} <-> x > v[i] && v[i] > v[j]
                /* for(int x = v[i] + 1; x < NMAX; x++) {
                    cnt += dp[j][x];
                } */
                cnt += dp[j][NMAX - 1] - dp[j][v[i]];
                // cnt += sume_partiale[NMAX - 1] - sume_partiale[v[i]];
            }
            if(v[i] < v[j]) {
                // putem sa continuam subsiruri de forma {..., x, v[j]} (numarate in dp[j][x]) cu {v[i]} <-> x < v[i] && v[i] < v[j]
                /* for(int x = 0; x < v[i]; x++) {
                    cnt += dp[j][x];
                } */
                cnt += dp[j][v[i] - 1];
            }

            // numara p-subsiruri care se termina cu {..., v[j], v[i]}
            dp[i][v[j]] += cnt;
        }

        for(int x = 0; x < NMAX; x++) {
            rasp += dp[i][x];
            if(x > 0) dp[i][x] += dp[i][x - 1]; // sume partiale peste dp[i][...]
        }
    }

    cout << rasp << endl;
}