Submission #934477

#TimeUsernameProblemLanguageResultExecution timeMemory
934477boris_mihovChorus (JOI23_chorus)C++17
61 / 100
7044 ms9236 KiB
#include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> typedef long long llong; const int MAXN = 1000000 + 10; const llong INF = 1e18; int n, k; struct ConvexHullTrick { }; int h[MAXN]; int next[MAXN]; llong prefix[MAXN]; std::pair <llong,int> dp[MAXN]; char s[2 * MAXN]; llong cost(int l, int r) { return prefix[r] - (r + 1) * (l - 1); } std::pair <llong,int> calc(llong penalty) { dp[n + 1] = {0, 0}; for (int pos = n ; pos >= 1 ; --pos) { dp[pos] = {INF, 0}; if (pos < next[pos]) { dp[pos] = dp[next[pos]]; dp[pos].first += penalty; dp[pos].second++; } llong addedValue = (next[pos] - pos + 1) * (pos - 1) + pos * (pos - 1) - prefix[next[pos]] + penalty; for (int nextPos = next[pos] + 1 ; nextPos <= n + 1 ; ++nextPos) { std::pair <llong,int> res = dp[nextPos]; res.first += addedValue + cost(pos, nextPos - 1); res.second += 1; dp[pos] = std::min(dp[pos], res); } } return dp[1]; } void solve() { int cntA = 0; int cntB = 0; for (int i = 1 ; i <= 2 * n ; ++i) { if (s[i] == 'B') { cntB++; } else { cntA++; h[cntA] = cntB; } } for (int i = 1 ; i <= n ; ++i) { prefix[i] = prefix[i - 1] + h[i]; } next[n + 1] = n + 1; h[n + 1] = n + 1; for (int i = n ; i >= 1 ; --i) { next[i] = next[i + 1]; while (next[i] >= i && h[next[i]] >= i) { next[i]--; } } llong l = -1, r = 1LL * n * n + 1, mid; while (l < r - 1) { mid = (l + r) / 2; if (calc(mid).second > k) l = mid; else r = mid; } auto [fL, groupsL] = calc(l); auto [fR, groupsR] = calc(r); fL -= groupsL * l; fR -= groupsR * r; if (groupsR == k) { std::cout << fR << '\n'; return; } std::cout << fL + (fR - fL) * (groupsL - k) / (groupsL - groupsR) << '\n'; } void input() { std::cin >> n >> k; std::cin >> s + 1; } void fastIOI() { std::ios_base :: sync_with_stdio(0); std::cout.tie(nullptr); std::cin.tie(nullptr); } int main() { fastIOI(); input(); solve(); return 0; }

Compilation message (stderr)

chorus.cpp: In function 'void input()':
chorus.cpp:112:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  112 |     std::cin >> s + 1;
      |                 ~~^~~
#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...