Submission #1295247

#TimeUsernameProblemLanguageResultExecution timeMemory
1295247IcelastChorus (JOI23_chorus)C++20
16 / 100
120 ms2516 KiB
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
void solve(){
    int N, K;
    cin >> N >> K;
    string s;
    cin >> s;
    s = ' ' + s;
    int j = 1;
    bool skip = false;
    ll EX = 0;
    for(int i = 1; i <= N*2; i++){
        if(skip){
            skip = false;
            continue;
        }
        if(s[i] == 'A') continue;
        while(s[j] == 'B'){
            j++;
        }
        assert(j <= N*2);
        if(j > i){
            EX += j-i;
            swap(s[i], s[j]);
            skip = true;
        }
        j++;
    }
    int it = -1;
    ll poss = 0, owe = 0, cur = 0;
    vector<ll> sump(1), X(1), cnt(1);
    for(int i = 1; i <= N*2; i++){
        if(s[i] == 'A'){
            cur++;
            it++;
            poss += i - it;
        }else{
            if(owe > 0){
                owe--;
            }else{
                sump.push_back(poss);
                X.push_back(i);
                cnt.push_back(cur);
                owe = cur-1;
                cur = 0;
                poss = 0;
            }
        }
    }
    int n = X.size()-1;
    vector<ll> pfsp(n+1, 0), pfcnt(n+1, 0);
    for(int i = 1; i <= n; i++){
        pfsp[i] = pfsp[i-1] + sump[i];
        pfcnt[i] = pfcnt[i-1] + cnt[i];
    }
    //lets do subtask n <= 500 first!
    if(n <= K){
        cout << EX;
        return;
    }
    vector<vector<ll>> f(n+1, vector<ll>(K+1, INF));
    f[0][0] = 0;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= K; j++){
            for(int p = 1; p <= i; p++){
                ll cost = pfsp[i]-pfsp[p] - (pfcnt[i]-pfcnt[p])*X[p] + pfcnt[p]*(pfcnt[i]-pfcnt[p]);
                f[i][j] = min(f[i][j], f[p-1][j-1] + cost);
            }
        }
    }
    cout << f[n][K] + EX;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
}
#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...