Submission #869462

#TimeUsernameProblemLanguageResultExecution timeMemory
869462HakiersMonochrome Points (JOI20_monochrome)C++17
25 / 100
270 ms604 KiB
#include <bits/stdc++.h> using namespace std; const int BASE = 1 << 11; int TREE[BASE << 1]; int n; string monochrome; queue<int> BPOS; queue<int> WPOS; void add(int v, int val){ v+=BASE; TREE[v] += val; v/=2; while(v > 0){ int l = 2*v, r = 2*v+1; TREE[v] = TREE[l] + TREE[r]; v/=2; } } int query(int a, int b){ a += BASE - 1; b += BASE + 1; int res = 0; while(a/2 != b/2){ if(!(a&1)) res += TREE[a+1]; if(b&1) res += TREE[b-1]; a/=2; b/=2; } return res; } void treeclear(){ for(int i = 0; i < (BASE << 1); i++) TREE[i] = 0; } int solve(int wsp){ treeclear(); for(int i = n+wsp; i >= 1 + wsp; i--){ if(monochrome[i] == 'B') BPOS.push(i); else if(monochrome[i] == 'W') WPOS.push(i); } int res = 0; for(int i = 2*n+wsp; i >= n+1 + wsp; i--){ if(monochrome[i] == 'B'){ int v = WPOS.front(); WPOS.pop(); //cout << "query: " << query(v, BASE-1) << "\n"; res += query(v, BASE-1); add(v, 1); } else if(monochrome[i] == 'W'){ int v = BPOS.front(); BPOS.pop(); //cout << "query: " << query(v, BASE-1) << "\n"; res += query(v, BASE-1); add(v, 1); } } return res; } int best(){ int res = 0; for(int i = 0; i <= n; i++) res = max(res, solve(i)); return res; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; cin >> monochrome; monochrome = monochrome + monochrome; monochrome = "#" + monochrome; /* for(int i = n; i >= 1; i--){ if(monochrome[i] == 'B') BPOS.push(i); else if(monochrome[i] == 'W') WPOS.push(i); } */ cout << best() << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...