Submission #1161307

#TimeUsernameProblemLanguageResultExecution timeMemory
1161307brintonGroup Photo (JOI21_ho_t3)C++20
100 / 100
278 ms98556 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> isReverse;
int getReverse(int l,int r){
    int ret = 0;
    // for(int i = l;i <= r;i++){
    //     for(int j = i;j <= r;j++){
    //         ret += isReverse[i][j];
    //     }
    // }
    ret = isReverse[r][r]-isReverse[l-1][r]-isReverse[r][l-1]+isReverse[l-1][l-1];
    return ret;
}
int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //start here
    int N;
    cin >> N;
    vector<int> v(N+1);
    vector<int> loc(N+1);
    for(int i = 1;i <= N;i++){
        cin >> v[i];
        loc[v[i]] = i;
    }
    isReverse = vector<vector<int>>(N+1,vector<int>(N+1,0));
    int total = 0;
    for(int i = 1;i <= N;i++){
        for(int j = i+1;j <= N;j++){
            if(loc[i] > loc[j]){
                isReverse[i][j] = -1;
                total++;
            }else{
                isReverse[i][j] = 1;
            }
        }
    }
    // makes it prefix;
    for(int i = 1;i <= N;i++){
        for(int j = 1;j <= N;j++){
            isReverse[i][j] += isReverse[i-1][j]+isReverse[i][j-1]-isReverse[i-1][j-1];
        }
    }
    vector<int> dp(N+1,0);
    dp[0] = 0;
    for(int i = 1;i <= N;i++){
        // chose a range to reverse
        for(int j = i;j >= 1;j--){
            int cost = getReverse(j,i);
            // cout << j << " "
            dp[i] = min(dp[i],dp[j-1]+cost);
        }
    }
    // for(int i = 1;i <= N;i++)cout << loc[i] << " ";cout << endl;
    // for(int i = 1;i <= N;i++)cout << dp[i] << " ";cout << endl;
    // cout << total << endl;
    cout << total+dp[N];
}
#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...