在舞台上,有 2N 只海狸排成一列。它们是合唱团的成员。每只海狸唱着高音部或低音部。这些信息由一个字符串 S 给出。具体地,如果 S 的第 i 个字符是 A,编号为 i 的海狸(从右边看台来看)唱高音。如果 S 的第 i 个字符是 B,编号为 i 的海狸唱低音。有 N 只海狸唱高音,有 N 只海狸唱低音。
从现在起,这些海狸将要演唱 K 首歌。然而,因为所有歌曲非常复杂,每只海狸只唱一首歌曲,不会唱其他歌曲。此外,为了使歌声更加美妙,每首歌曲必须满足以下条件:
voidprework(){ int cnta = 0, cntb = 0; for (int i = 1; i <= 2 * n; ++i) { if (s[i] == 'A') c[++cnta] = cntb; else ++cntb; } for (int i = 1; i <= n; ++i) sumc[i] = sumc[i - 1] + c[i]; for (int i = 1, j = 0; i <= n; ++i) { for (; j < n && c[j + 1] < i; ++j) {} nxt[i] = std::max(i, j); } }
voidadd(pii *stk, int &top, pii p){ for (; top >= 2 && mul(sub(p, stk[top]), sub(stk[top], stk[top - 1])) >= 0; --top) {} stk[++top] = p; }
intcalc(pii p, int x){ return x * p.first + p.second; }
std::pair<int, int> check(int x){ staticint id[kMaxN]; static pii stk[kMaxN]; int top = 0; for (int i = 1, lst = -1; i <= n; ++i) { int now = std::min(i - 1, c[i]); for (; lst < now; ++lst, add(stk, top, {a[lst], b[lst]}), id[top] = lst) {} f[i] = 1e18, g[i] = 1e18; int L = 1, R = top + 1, res = 1; while (L + 1 < R) { int mid = (L + R) >> 1; if (calc(stk[mid], -i) < calc(stk[mid - 1], -i)) L = res = mid; else R = mid; } int j = id[res]; f[i] = -i * a[j] + b[j] + sumc[i] - x, g[i] = g[j] + 1; a[i] = i, b[i] = f[i] - sumc[nxt[i]] + i * nxt[i]; } return {f[n], g[n]}; }
voiddickdreamer(){ std::cin >> n >> k >> s; s = " " + s; prework(); int L = -1e12, R = 1, res = 1; while (L + 1 < R) { int mid = (L + R) >> 1; if (check(mid).second <= k) L = res = mid; else R = mid; } auto p = check(res); std::cout << p.first + res * k << '\n'; }