Submission #889529

#TimeUsernameProblemLanguageResultExecution timeMemory
889529MilosMilutinovicMonochrome Points (JOI20_monochrome)C++14
100 / 100
1010 ms30580 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; string s; cin >> s; string t = ""; for (int i = 0; i < 2 * n; i++) { if (s[i] == 'B') { for (int j = 0; j < 2 * n; j++) { t += s[(i + j) % (2 * n)]; } break; } } s = t; vector<int> a; vector<int> b; for (int i = 0; i < 2 * n; i++) { if (s[i] == 'B') { a.push_back(i); } else { b.push_back(i); } } vector<int> fenw(2 * n); auto Modify = [&](int x, int v) { while (x < 2 * n) { fenw[x] += v; x |= (x + 1); } }; auto Query = [&](int x) { int v = 0; while (x >= 0) { v += fenw[x]; x = ((x & (x + 1))) - 1; } return v; }; auto GetSum = [&](int L, int R) { return Query(R) - Query(L - 1); }; vector<vector<array<int, 3>>> qs(2 * n + 1); vector<int> to(2 * n + 1, -1); auto Solve = [&](int k) { for (int i = 0; i <= 2 * n; i++) { qs[i].clear(); to[i] = -1; } for (int i = 0; i < n; i++) { int L = a[i]; int R = b[(i + k) % n]; to[L] = R; if (L <= R) { qs[L].push_back({0, L - 1, -1}); qs[L].push_back({R + 1, 2 * n - 1, -1}); qs[R].push_back({0, L - 1, +1}); qs[R].push_back({R + 1, 2 * n - 1, +1}); } else { swap(L, R); qs[L].push_back({L + 1, R - 1, +1}); qs[R].push_back({L + 1, R - 1, -1}); qs[2 * n].push_back({L + 1, R - 1, +1}); } } for (int i = 0; i < 2 * n; i++) { fenw[i] = 0; } long long ret = 0; for (int i = 0; i <= 2 * n; i++) { for (auto& p : qs[i]) { if (p[0] <= p[1]) { ret += GetSum(p[0], p[1]) * p[2]; } } if (to[i] != -1) { Modify(to[i], 1); } } return ret; }; int low = 0, high = n - 2; long long ans = Solve(n - 1); while (low <= high) { int mid = low + high >> 1; long long a = Solve(mid); long long b = Solve(mid + 1); ans = max(ans, a); ans = max(ans, b); if (a > b) { high = mid - 1; } else { low = mid + 2; } } cout << ans << '\n'; return 0; }

Compilation message (stderr)

monochrome.cpp: In function 'int main()':
monochrome.cpp:91:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   91 |     int mid = low + high >> 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...