Submission #1042767

#TimeUsernameProblemLanguageResultExecution timeMemory
1042767abczzChorus (JOI23_chorus)C++17
100 / 100
1760 ms63960 KiB
#include <iostream> #include <algorithm> #include <deque> #include <vector> #include <array> #include <cmath> #define ll long long #define ld long double using namespace std; ll n, k, l, r, mid, dp[1000000]; ll tot[1000000]; ld ep = 1e-8; vector <ll> A, B, nxA, ps; string S, T; struct Line{ ll m; ll c; ll x; }; ld intx(Line I, Line J) { return (ld)(I.c-J.c)/(J.m-I.m); } ll C(ll l, ll r) { if (nxA[l] > r) return 0; ll nx = max(l, nxA[l]), cnt = r-nx+1, cnt2 = max(0LL, l-nxA[l]); return ps[r]-(nx ? ps[nx-1] : 0)-cnt*B[l]-cnt*(cnt-1)/2-(r-l+1)*cnt2; } ll f(ll i) { ll nx = max(i, nxA[i]), cnt2 = max(0LL, i-nxA[i]); return -(nx ? ps[nx-1] : 0)+nx*B[i]-B[i] + (-nx*nx+nx)/2 + cnt2*i - cnt2; } ll g(ll j) { return ps[j] + (-j*j-j)/2; } ll h(ll i) { return nxA[i]-B[i]; } void solve() { deque <Line> dq; dq.push_back({h(0), f(0), 0}); for (ll i=0; i<n; ++i) { while (dq.size() > 1) { auto I = dq.front(); dq.pop_front(); auto J = dq.front(); if ((ld)i-intx(I, J) > ep || fabs((ld)i-intx(I, J)) <= ep) continue; else { dq.push_front(I); break; } } auto X = dq.front(); dp[i] = X.m * i + X.c + g(i) + mid; tot[i] = X.x+1; if (i != n-1) { Line K = {h(i+1), dp[i] + f(i+1), tot[i]}; while (dq.size() > 1) { auto J = dq.back(); dq.pop_back(); auto I = dq.back(); if (intx(I, J)-intx(I, K) > ep || fabs(intx(I, J)-intx(I, K)) <= ep) continue; else { dq.push_back(J); break; } } dq.push_back(K); } } } int main() { cin.tie(0); ios::sync_with_stdio(0); cin >> n >> k >> S; for (int i=0; i<2*n; ++i) { if (S[i] == 'A') { ps.push_back((ps.empty() ? 0 : ps.back()) + i); A.push_back(i); } else { B.push_back(i); nxA.push_back(A.size()); } } l = 0, r = n*n; while (l < r) { mid = (l+r+1)/2; solve(); if (k > tot[n-1]) r = mid-1; else l = mid; } mid = l; solve(); cout << dp[n-1] - k * mid << '\n'; }
#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...