Submission #1156688

#TimeUsernameProblemLanguageResultExecution timeMemory
1156688onbertChorus (JOI23_chorus)C++17
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6 + 5, INF = 1e18;

vector<pair<int,int>> vec;
bool sel[maxn];
int sz, mrge;

pair<int,int> solve(int mn, int mx) {
    pair<int,int> dp[sz+1];
    for (int i=0;i<=sz;i++) dp[i] = {INF, INF};
    dp[0] = {0, 0};
    for (int i=0;i<sz;i++) {
        int cur = 0, val = 0;
        for (int j=i;j<sz;j++) {
            val += cur * vec[j].first;
            if (j != i) val -= vec[j].second;
            cur += vec[j].first;
            if (val > mx || val < mn) continue;
            dp[j+1] = min(make_pair(dp[i].first + 1, dp[i].second + val), dp[j+1]);
            // cout << i << " " << j << " " << cur << " " << val << endl;
        }
        // cout << i << " " << dp[i].first << " " << dp[i].second << endl;
    }
    return dp[sz];
}

signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n, k;
    cin >> n >> k;
    int cnt[n+2];
    for (int i=0;i<=n+1;i++) cnt[i] = 0;
    int cur = 1;
    for (int i=1;i<=2*n;i++) {
        char x;
        cin >> x;
        if (x == 'B') cur++;
        else cnt[cur]++;
    }
    int init = 0, cum = 0;
    for (int i=1;i<=n;i++) {
        cum += cnt[i];
        if (cum < i) {
            int need = i - cum;
            cnt[i+1] -= need, cnt[i] += need, cum += need;
            init += need;
        }
    }
    int u = 1;
    vec.push_back({cnt[1], 0});
    while (u < n) {
        int v = u + vec.back().first;
        vec.push_back({0, 0});
        for (; u < v; u++) {
            vec.back().first += cnt[u+1];
            vec.back().second += cnt[u+1] * (v - (u + 1));
        }
    }

    sz = vec.size(), mrge = sz - k;
    // cout << sz << endl;
    // for (auto [x, y]:vec) cout << x << " " << y << endl;


    int ans = 0;
    int l = 0, r = 1e18;
    while (l < r) {
        int mid = (l+r)/2;
        if (solve(0, mid).first <= k) r = mid;
        else l = mid+1;
    }
    int MX = l;
    l = 0, r = MX;
    while (l < r) {
        int mid = (l+r+1)/2;
        if (solve(mid, MX).first <= k) l = mid;
        else r = mid-1;
    }
    // cout << l << endl;

    cout << solve(l, MX).second + init << "\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...