Submission #934470

#TimeUsernameProblemLanguageResultExecution timeMemory
934470boris_mihovChorus (JOI23_chorus)C++17
16 / 100
7068 ms6632 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; int h[MAXN]; int next[MAXN]; llong prefix[MAXN]; std::pair <llong,int> dp[MAXN]; bool bl[MAXN]; char s[2 * MAXN]; llong cost(int l, int r) { if (next[l] > r) { return 0; } return (next[l] - l + 1) * (l - 1) + prefix[r] - prefix[next[l]] - (r - l + 1) * (l - 1); } int timer; std::pair <llong,int> f(int pos, llong penalty) { if (pos == n + 1) { return {0, 0}; } if (bl[pos] == timer) { return dp[pos]; } dp[pos] = {INF, 0}; bl[pos] = timer; for (int next = pos + 1 ; next <= n + 1 ; ++next) { std::pair <llong,int> res = f(next, penalty); res.first += cost(pos, next - 1) + penalty; res.second += 1; dp[pos] = std::min(dp[pos], res); } return dp[pos]; } 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) { timer++; mid = (l + r) / 2; if (f(1, mid).second > k) l = mid; else r = mid; } auto [fL, groupsL] = f(1, l); auto [fR, groupsR] = f(1, 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:115:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  115 |     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...