Submission #1095916

#TimeUsernameProblemLanguageResultExecution timeMemory
1095916_8_8_Monochrome Points (JOI20_monochrome)C++17
35 / 100
2017 ms6880 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5 + 12, MOD = (int)1e9 + 7; int n, t[N * 2], val[N]; string s; vector<int> x, y; void add(int i, int val) { while(i <= n + n) { t[i] += val; i += i & -i; } } ll get(int i) { ll ret = 0; while(i) { ret += t[i]; i -= i & -i; } return ret; } ll get(int l, int r) { return get(r) - get(l - 1); } ll mem[N]; ll calc(int k) { if(mem[k] != -1) { return mem[k]; } for(int i = 1; i <= n + n; i++) { t[i] = 0; } ll ret = 0; for(int i = 0; i < n; i++) { int j = (i + k) % n; int l = x[i], r = y[j]; if(l > r) { swap(l, r); } val[l] = -1; val[r] = l; } for(int x = 1; x <= n + n; x++) { int y = val[x]; if(y == -1) { add(x, 1); } else { ret += get(y + 1, x); add(y, -1); } } return mem[k] = ret; } void test() { memset(mem, -1, sizeof(mem)); cin >> n >> s; for(int i = 0; i < n + n; i++) { if(s[i] == 'W') { x.push_back(i + 1); } else { y.push_back(i + 1); } } if(n == 1) { cout << 0 << '\n'; return; } if(calc(0) < calc(1)) { int l = 1, r = n; while(r - l > 1) { int mid = (l + r) >> 1; if(calc(mid) > calc(mid - 1)) { l = mid; } else { r = mid; } } cout << calc(l) << '\n'; } else { int l = -1, r = n - 1; while(r - l > 1) { int mid = (l + r) >> 1; if(calc(mid) > calc(mid + 1)) { r = mid; } else { l = mid; } } cout << calc(r) << '\n'; } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while(t--) test(); 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...