#include <bits/stdc++.h>
#define int long long
using namespace std;
pair<int, int> dp[1000005];
vector<int> a, b, sum;
int calc(pair<int, int> line, int x)
{
return line.first*x+line.second;
}
long double intersect(pair<int, int> line1, pair<int, int> line2)
{
return (long double)(line1.second-line2.second)/(line2.first-line1.first);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, k, cnt=0, ans=0;
string s, str;
cin >> n >> k >> s;
for (int i=0; i<n*2; i++)
{
if (s[i]=='A' && cnt<0)
ans-=cnt;
if (s[i]=='A')
cnt++;
else
cnt--;
if (cnt<=0)
str.push_back('A'+(int)(i&1));
else
str.push_back(s[i]);
}
for (int i=0; i<n*2; i++)
{
if (str[i]=='A')
a.push_back(i);
else
b.push_back(i);
}
sum.push_back(a[0]);
for (int i=1; i<n; i++)
sum.push_back(sum.back()+a[i]-i);
int l=0, r=n*n;
while (1)
{
int C=(l+r)/2;
deque<pair<pair<int, int>, int> > q;
q.push_back({{0, 0}, 0});
for (int i=1; i<=n; i++)
{
while (q.size()>=2 && calc(q[0].first, i)>calc(q[1].first, i))
q.pop_front();
dp[i]={calc(q[0].first, i)+sum[i-1]+C, q[0].second+1};
pair<int, int> p={-i, dp[i].first+i*(b[i-1]-(i-1))-sum[b[i-1]-i]};
while (q.size()>=2 && intersect(q[q.size()-1].first, p)<intersect(q[q.size()-2].first, q[q.size()-1].first))
q.pop_back();
q.push_back({p, dp[i].second});
}
if (l==r)
break;
if (dp[n].second>k)
l=C+1;
else
r=C;
}
cout << ans+dp[n].first-l*k;
}
# | 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... |