Submission #439346

#TimeUsernameProblemLanguageResultExecution timeMemory
439346vkgainzGroup Photo (JOI21_ho_t3)C++17
100 / 100
384 ms196528 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N; cin >> N;
    vector<int> H(N);
    vector<int> P(N);
    for(int i = 0; i < N; i++) {
        cin >> H[i];
        --H[i];
        P[H[i]] = i;
    }
    vector<int> dp(N + 1);
    vector<vector<int>> l(N, vector<int>(N));
    for(int j = 0; j < N; j++) {
        for(int i = 0; i < j; i++) {
            if(i > 0) l[i][j] = l[i - 1][j];
            l[i][j] += (P[i] > P[j]);
        }
    }
    vector<vector<int>> inv(N, vector<int>(N));
    for(int len = 2; len <= N; len++) {
        for(int i = 0; i + len - 1 < N; i++) {
            int j = i + len - 1;
            inv[i][j] = inv[i][j - 1] + inv[i + 1][j] - inv[i + 1][j - 1] + (P[i] < P[j]);
        }
    }
    for(int i = N - 1; i >= 0; i--) {
        dp[i] = 1000000000;
        int sum = 0;
        for(int j = i; j < N; j++) {
            sum += P[j];
            if(i > 0) sum += l[i - 1][j];
            int cost = sum + inv[i][j] - (i + j) * (j - i + 1) / 2;
            dp[i] = min(dp[i], dp[j + 1] + cost);
        }
    }
    cout << dp[0];
}
#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...