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...