Submission #492310

#TimeUsernameProblemLanguageResultExecution timeMemory
492310alextodoranMonochrome Points (JOI20_monochrome)C++17
100 / 100
977 ms8072 KiB
/** ____ ____ ____ ____ ____ ||a |||t |||o |||d |||o || ||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\| **/ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N_MAX = 200000; int N; string s; vector <int> v[2]; int Fen[N_MAX * 2 + 2]; void update (int x) { x++; for (int i = x; i <= N * 2; i += i & -i) { Fen[i]++; } } int query (int x) { x++; int cnt = 0; for (int i = x; i >= 1; i -= i & -i) { cnt += Fen[i]; } return cnt; } int intersections (int x, int y) { return query(y) - query(x); } ll solve (int offs) { for (int i = 1; i <= N * 2; i++) { Fen[i] = 0; } vector <pair <int, int>> segments; for (int i = 0; i < N; i++) { int j = (i + offs) % N; segments.push_back(make_pair(v[0][i], v[1][j])); if (segments.back().first > segments.back().second) { swap(segments.back().first, segments.back().second); } } sort(segments.begin(), segments.end()); ll cnt = 0; for (pair <int, int> p : segments) { cnt += intersections(p.first, p.second); update(p.second); } return cnt; } int main () { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N; cin >> s; for (int i = 0; i < N * 2; i++) { v[(s[i] == 'B')].push_back(i); } int l = 0, r = N - 1; while (l < r) { int mid = (l + r) / 2; if (solve(mid) < solve(mid + 1)) { l = mid + 1; } else { r = mid; } } cout << solve(l) << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...