This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |