Submission #1327922

#TimeUsernameProblemLanguageResultExecution timeMemory
1327922ivan_alexeevGroup Photo (JOI21_ho_t3)C++20
100 / 100
816 ms392712 KiB
#include <bits/stdc++.h>

using namespace std;

#ifndef lisie_bimbi
#define endl '\n'
#pragma GCC optimize("O3")
#pragma GCC target("avx,avx2,bmi2,fma")
#endif

using ll = long long;
const ll inf = 1'000'000'000;

struct fenwick{
    int n;
    vector<int> a;
    vector<int> d;
    void upd(int ind, int dd){
        ind++;
        for(int i = ind; i <= n; i += (i & (-i))){
            d[i] += dd;
        }
    }
    int get(int l, int r){
        r++;
        int ans = 0;
        for(int i = r; i > 0; i -= (i & (-i))){
            ans += d[i];
        }
        for(int i = l; i > 0; i -= (i & (-i))){
            ans -= d[i];
        }
        return ans;
    }
    fenwick(int n1){
        n = n1;
        a.resize(n + 1);
        d.resize(n + 1);
    }
};

vector<vector<int>> pref;
vector<vector<int>> pref2;

int get(int i, int l, int r){
    return pref[i][r] - pref[i][l];
}

int get2(int i, int l, int r){
    return pref2[i][r] - pref2[i][l];
}

void solve(){
    int n;
    cin >> n;
    vector<int> a(n);
    for(int i = 0; i < n; i++){
        cin >> a[i];
        a[i]--;
    }
    vector<vector<int>> leftless_more(n + 1, vector<int>(n));
    for(int z = 0; z < n; z++){
        fenwick f(n); 
        for(int i = 0; i < n; i++){
            leftless_more[z][a[i]] = f.get(0, a[i]);
            if(a[i] >= z){
                f.upd(a[i], 1);
            }
        }
    }
    pref.resize(n + 1, vector<int>(n + 1));
    for(int i = 0; i <= n; i++){
        for(int j = 1; j <= n; j++){
            pref[i][j] = pref[i][j - 1] + leftless_more[i][j - 1];
        }
    }
    vector<vector<int>> more(n + 1, vector<int>(n));
    for(int z = 0; z < n; z++){
        int cnt = 0;
        for(int i = 0; i < n; i++){
            more[z][a[i]] = cnt;
            if(a[i] >= z){
                cnt++;
            }
        }
    }
    pref2.resize(n + 1, vector<int>(n + 1));
    for(int i = 0; i <= n; i++){
        for(int j = 1; j <= n; j++){
            pref2[i][j] = pref2[i][j - 1] + more[i][j - 1];
        }
    }
    // for(auto i : leftless_more){
    //     for(auto j : i){
    //         cout << j << ' ';
    //     }
    //     cout << endl;
    // }
    // cout << endl;
    vector<int> dp(n + 1, inf);
    dp[0] = 0;
    for(int i = 1; i <= n; i++){
        for(int j = 0; j < i; j++){
            int cost = get(j, j, i) + get2(i, j, i);
            dp[i] = min(dp[i], dp[j] + cost);
            // cout << j << ' ' << i << ' ' << dp[i] << endl;
        }
    }
    // for(auto i : dp){
    //     cout << i << ' ';
    // }
    // cout << endl;
    cout << dp[n] << endl;
}

signed main(){
#ifdef lisie_bimbi
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
#endif
    cin.tie(nullptr)->sync_with_stdio(false);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...