Submission #1316698

#TimeUsernameProblemLanguageResultExecution timeMemory
1316698jahongirChorus (JOI23_chorus)C++20
61 / 100
600 ms1460 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define all(a) a.begin(),a.end()

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef unsigned long long ull;
typedef vector<int> vi;


const int mxn = 5000;
vector<int> A(1,0), B(1,0);
int n;

ll dp[2*mxn+1];
int cnt[2*mxn+1];

pair<ll,ll> get(ll lambda){
    fill(dp,dp+2*n+1,1e18);
    dp[0] = 0, cnt[0] = 0;

    for(int j = 0; j < 2*n; j+=2){
        ll sum = dp[j]+lambda;
        for(int l = 1; j + 2*l <= 2*n; l++){
            sum += max(0,A[l+j/2]-l-j);
            if(dp[j+2*l] > sum){
                dp[j+2*l] = sum;
                cnt[j+2*l] = cnt[j]+1;
            }else if(dp[j+2*l] == sum){
                cnt[j+2*l] = min(cnt[j+2*l],cnt[j]+1);
            }
        }
    }

    return {dp[2*n],cnt[2*n]};
}




void solve(){
    int k; cin >> n >> k;
    for(int i = 1; i <= 2*n; i++){
        char c; cin >> c;
        if(c=='A') A.emplace_back(i);
        else B.emplace_back(i);
    }

    ll l = -1, r = 1e15;

    while(l+1 < r){
        ll mid = (l+r)>>1;
        auto [ans,res] = get(mid);
        if(res <= k) r = mid;
        else l = mid;
    }

    auto [ans,res] = get(r);

    cout << ans - r*k;
}

signed main(){
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    // cin >> t;
    while(t--){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...