Submission #870026

#TimeUsernameProblemLanguageResultExecution timeMemory
870026PanndaGroup Photo (JOI21_ho_t3)C++17
100 / 100
329 ms98804 KiB
#include <bits/stdc++.h>
using namespace std;

const int INF = (int)1e9 + 123456;

struct Fenwick {
    int n;
    vector<int> bit;

    Fenwick(int n) : n(n), bit(n + 1, 0) {}

    void add(int i, int delta) {
        for (i++; i <= n; i += i & -i) {
            bit[i] += delta;
        }
    }

    int sum(int i) {
        int res = 0;
        for (; i > 0; i -= i & -i) {
            res += bit[i];
        }
        return res;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> ia(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        a[i]--;
        ia[a[i]] = i;
    }

    vector<vector<int>> cost(n, vector<int>(n));
    vector<int> offset(n, 0);
    for (int l = 0; l < n; l++) {
        Fenwick fen(n);
        int inv = 0;
        int sum_indices = 0;
        for (int r = l; r < n; r++) {
            inv += fen.sum(ia[r]);
            fen.add(ia[r], +1);
            sum_indices += ia[r] + offset[ia[r]];

            cost[l][r] = inv + sum_indices - (r - l) * (r - l + 1) / 2;
        }
        for (int i = ia[l] + 1; i < n; i++) {
            offset[i]--;
        }
    }

    vector<int> dp(n + 1, INF);
    dp[0] = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i; j >= 0; j--) {
            dp[i + 1] = min(dp[i + 1], dp[j] + cost[j][i]);
        }
    }
    cout << dp[n] << '\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...