Submission #939045

#TimeUsernameProblemLanguageResultExecution timeMemory
939045weakweakweakGroup Photo (JOI21_ho_t3)C++17
100 / 100
726 ms122232 KiB
#include <bits/stdc++.h>
using namespace std;

int n, dp[5100], a[5100], cost[5100][5100] = {0};
short woo[5100][5100] = {0}; //woo[i][j]代表在i前面大於j的有幾個

struct BIT {
    int n, a[5100];
    void init (int x) {
        n = x;
        memset(a, 0, sizeof(a));
    }
    void update (int i, int x) {for (;i <= n; i += i & -i) a[i] += x; }
    int query (int i) {
        int res = 0;
        for (; i > 0; i -= i & -i) res += a[i];
        return res;
    }
} bit;


int main () {
    ios_base::sync_with_stdio(false); cin.tie(0);
    memset(dp, 63, sizeof(dp));
    dp[0] = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    
    //順序數對
    int cnt = 0;
    for (int l = 1; l <= n; l++) {
        bit.init(n);
        for (int j = 1; j <= n; j++) {
            if (a[j] < l) continue;
            cost[l][a[j]] = bit.query(a[j]);
            bit.update(a[j], 1);
        }
        for (int r = l; r <= n; r++) cost[l][r + 1] += cost[l][r];
    }
    //在我前面比r大的跟我換
    bit.init(n);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n + 2; j++) woo[a[i]][j] = i - 1 - bit.query(j);
        bit.update(a[i], 1);
    }
    for (int r = 1; r <= n; r++) {
        int haha = 0;
        for (int l = r; l >= 1; l--) {
            haha += woo[l][r];
            cost[l][r] += haha;
        }
    }

    //dp
    for (int i = 1; i <= n; i++) for (int j = 0; j < i; j++) dp[i] = min(dp[i], dp[j] + cost[j + 1][i]);
    cout << dp[n] << '\n';
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:30:9: warning: unused variable 'cnt' [-Wunused-variable]
   30 |     int cnt = 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...