제출 #994795

#제출 시각아이디문제언어결과실행 시간메모리
99479512345678Chorus (JOI23_chorus)C++17
100 / 100
1839 ms55668 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; struct line { ll m, c, cnt; line(ll m=0, ll c=0, ll cnt=0): m(m), c(c), cnt(cnt){} ll val(ll x) {return m*x+c;} }; struct convexhulltrick { deque<line> dq; ll bad(line a, line b, line c) { return (a.c-c.c)*(b.m-a.m)<(a.c-b.c)*(c.m-a.m); } void add(line x) { while (dq.size()>=2&&bad(dq[dq.size()-2], dq.back(), x)) dq.pop_back(); dq.push_back(x); } line query(ll x) { while (dq.size()>=2&&dq[0].val(x)>dq[1].val(x)) dq.pop_front(); return dq[0]; } } d; pair<ll, ll> solve(ll lambda) { idx=1; d.dq.clear(); for (int i=1; i<=n; i++) { while (idx<=p[i]&&idx<=i) d.add(line(-idx, qs[idx-1]+dp[idx-1].first, dp[idx-1].second)), idx++; dp[i]={d.query(i).val(i)+i*p[i]-qs[p[i]-1]+lambda, d.query(i).cnt+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; } /* cout<<"debug "<<1<<'\n'; solve(1); for (int i=1; i<=n; i++) cout<<i<<' '<<dp[i].first<<' '<<dp[i].second<<'\n'; for (auto x:d.dq) cout<<"dq "<<x.m<<' '<<x.c<<' '<<x.cnt<<'\n';*/ ll l=0, r=1e12; while (l<r) { ll md=(l+r)/2; if (solve(md).second<=k) r=md; else l=md+1; } cout<<solve(l).first-k*l; } /* (a.c-c.c)/(c.m-a.m)<(a.c-b.c)/(b.m-a.m) */
#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...