Submission #994618

#TimeUsernameProblemLanguageResultExecution timeMemory
99461812345678Chorus (JOI23_chorus)C++17
61 / 100
7031 ms7520 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=1e6+5;

#define ll long long

ll n, k, h[nx], p[nx], qs[nx], r=0, c=1, idx=1;
pair<ll, ll> dp[nx];
string s;

ll cost(ll l, ll r)
{
    if (p[r]<=l) return 0;
    return r*(p[r]-l)-(qs[p[r]-1]-qs[l-1]);
}

pair<ll, ll> solve(ll lambda)
{
    for (int i=1; i<=n; i++)
    {
        dp[i]={LLONG_MAX, 0};
        for (int j=1; j<=i; j++)
        {
            dp[i]=min(dp[i], {dp[j-1].first+cost(j, i)+lambda, dp[j-1].second+1});
        }
    }
    return dp[n];
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>k>>s;
    for (int i=0; i<2*n; i++)
    {
        if (s[i]=='A') r++, h[c]=r;
        if (s[i]=='B') c++, h[c]=r;
    }
    for (int i=1; i<=n; i++)
    {
        qs[i]=qs[i-1]+h[i];
        while (idx<=i&&h[idx]<i) idx++;
        p[i]=idx;
    }
    //for (int i=1; i<=n; i++) cout<<i<<' '<<h[i]<<' '<<p[i]<<'\n';
    ll l=0, r=1e12;
    while (l<r)
    {
        ll md=(l+r)/2;
        //cout<<md<<' '<<solve(md).first<<' '<<solve(md).second<<'\n';
        if (solve(md).second<=k) r=md;
        else l=md+1;
    }
    //cout<<"debug "<<l<<' '<<solve(l).first<<' '<<solve(l).second<<'\n';
    cout<<solve(l).first-k*l;
}
#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...