#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 = 1e5;
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 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... |