Submission #959083

#TimeUsernameProblemLanguageResultExecution timeMemory
959083antonGroup Photo (JOI21_ho_t3)C++17
100 / 100
337 ms196452 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
const int MAX_N = 5001;

int n;
int dp[MAX_N];
int vals[MAX_N];
int pos[MAX_N];
int oc_under_pref[MAX_N][MAX_N];

void precalc(){
    for(int i = 0; i<=n; i++){
        vector<int> oc(n, 0);
        for(int j = 0; j<i; j++){
            oc[vals[j]]++;
        }
        int cur = 0;
        for(int j=0; j<=n; j++){
            oc_under_pref[i][j] = cur;
            if(j<n){
                cur += oc[j];
            }
        }
    }
}

int find_dp(){
    dp[0] = 0;
    for(int i = 0; i<n; i++){
        int cur_c= 0;
        for(int j = i; j<n; j++){
            //cout<<"j "<<j<<" "<<pos[j]<<" "<<oc_under_pref[pos[j]][j]<<endl;
            cur_c += pos[j]-oc_under_pref[pos[j]][i];
            cur_c-= (oc_under_pref[n][j]-oc_under_pref[n][i]-oc_under_pref[pos[j]][j]+oc_under_pref[pos[j]][i]);
            dp[j+1] =min(dp[j+1], dp[i]+cur_c);
        }
    }
    return dp[n];
}


signed main(){
    cin>>n;
    for(int i = 0; i<n; i++){
        cin>>vals[i];
        vals[i]--;
        pos[vals[i]] = i;
    }
    for(int i = 0; i<=n; i++){
        dp[i] = 1e18;
    }

    precalc();
    cout<<find_dp()<<endl;
}
#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...