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...