제출 #1034560

#제출 시각아이디문제언어결과실행 시간메모리
1034560BF001Election (BOI18_election)C++17
100 / 100
376 ms42992 KiB
#include<bits/stdc++.h> using namespace std; #define N 500005 struct node{ int rm, lm, sum, ans; node(){ rm = lm = sum = ans = 0; } node operator + (node o){ node rt; rt.sum = sum + o.sum; rt.lm = max(lm, sum + o.lm); rt.rm = max(o.rm, o.sum + rm); rt.ans = max({lm + o.rm, ans + o.sum, sum + o.ans}); return rt; } }; struct segtree { int n; vector<node> bit; segtree(int siz){ n = siz; bit.resize(4 * siz + 1); } void ud(int id, int l, int r, int pos, int typ){ if (l > pos || r < pos) return; if (l == r){ if (typ == 1) bit[id].rm = bit[id].lm = bit[id].sum = bit[id].ans = 1; else bit[id].rm = 0, bit[id].lm = 0, bit[id].sum = -1, bit[id].ans = 0; return; } int mid = (l + r) >> 1; ud(id * 2, l, mid, pos, typ); ud(id * 2 + 1, mid + 1, r, pos, typ); bit[id] = bit[id * 2] + bit[id * 2 + 1]; } node nll; node get(int id, int l, int r, int u, int v){ if (l > v || r < u) return nll; if (l >= u && r <= v) return bit[id]; int mid = (l + r) >> 1; node t = get(id * 2, l, mid, u, v); node tt = get(id * 2 + 1, mid + 1, r, u, v); return (t + tt); } void insert(int pos, int typ){ ud(1, 1, n, pos, typ); } int get(int l, int r){ return get(1, 1, n, l, r).ans; } }; signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL); int n; string s; cin >> n; cin >> s; segtree s1(n); s = " " + s; for (int i = 1; i <= n; i++){ if (s[i] == 'C'){ s1.insert(i, -1); } else s1.insert(i, 1); } int q; cin >> q; while (q--){ int l, r; cin >> l >> r; cout << s1.get(l, r) << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...