Submission #465524

#TimeUsernameProblemLanguageResultExecution timeMemory
465524alextodoranStreet Lamps (APIO19_street_lamps)C++17
20 / 100
5071 ms524292 KiB
/** ____ ____ ____ ____ ____ ||a |||t |||o |||d |||o || ||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\| **/ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N_MAX = 300000; const int Q_MAX = 300000; int n, q; bool light[N_MAX + 2]; struct SGTNode { int len; int pref; int suff; }; SGTNode join (const SGTNode &u, const SGTNode &v) { return SGTNode { u.len + v.len, (u.pref == u.len ? u.len + v.pref : u.pref), (v.suff == v.len ? v.len + u.suff : v.suff) }; } SGTNode SGT[N_MAX * 4 + 2]; void build (int node, int l, int r) { if(l == r) { SGT[node] = SGTNode{1, light[l], light[l]}; return; } int mid = (l + r) / 2; int lSon = node * 2, rSon = node * 2 + 1; build(lSon, l, mid); build(rSon, mid + 1, r); SGT[node] = join(SGT[lSon], SGT[rSon]); } void build () { build(1, 1, n); } void update (int node, int l, int r, int upos) { if(l == r) { SGT[node].pref = 1 - SGT[node].pref; SGT[node].suff = 1 - SGT[node].suff; return; } int mid = (l + r) / 2; int lSon = node * 2, rSon = node * 2 + 1; if(upos <= mid) update(lSon, l, mid, upos); else update(rSon, mid + 1, r, upos); SGT[node] = join(SGT[lSon], SGT[rSon]); } void update (int upos) { update(1, 1, n, upos); } SGTNode query (int node, int l, int r, int ql, int qr) { if(ql <= l && r <= qr) return SGT[node]; int mid = (l + r) / 2; int lSon = node * 2, rSon = node * 2 + 1; if(ql <= mid && mid + 1 <= qr) return join(query(lSon, l, mid, ql, qr), query(rSon, mid + 1, r, ql, qr)); else if(ql <= mid) return query(lSon, l, mid, ql, qr); else return query(rSon, mid + 1, r, ql, qr); } SGTNode query (int ql, int qr) { if(ql > qr) return SGTNode{0, 0, 0}; return query(1, 1, n, ql, qr); } unordered_map <int, int> BIT[(N_MAX + 1) + 2]; void BITupdate (int x, int y, int uval) { for(int i = x; i <= n + 1; i += i & -i) for(int j = y; j <= n + 1; j += j & -j) BIT[i][j] += uval; } void BITupdate (int lx, int rx, int ly, int ry, int uval) { if(lx > rx || ly > ry) return; BITupdate(lx, ly, uval); BITupdate(rx + 1, ly, -uval); BITupdate(lx, ry + 1, -uval); BITupdate(rx + 1, ry + 1, uval); } int BITquery (int x, int y) { int answer = 0; for(int i = x; i >= 1; i -= i & -i) for(int j = y; j >= 1; j -= j & -j) answer += BIT[i][j]; return answer; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> q; { string s; cin >> s; for(int i = 1; i <= n; i++) light[i] = (s[i - 1] == '1'); } build(); for(int i = 2; i <= n + 1; i++) if(light[i - 1] == true) { int lLen = query(1, i - 1).suff; BITupdate(i - lLen, i - 1, i, i, + q); } for(int qi = 1; qi <= q; qi++) { string type; cin >> type; if(type == "toggle") { int upos; cin >> upos; int lLen = query(1, upos - 1).suff; int rLen = query(upos + 1, n).pref; if(light[upos] == true) BITupdate(upos - lLen, upos, upos + 1, upos + 1 + rLen, - (q - qi)); light[upos] = !light[upos]; update(upos); if(light[upos] == true) BITupdate(upos - lLen, upos, upos + 1, upos + 1 + rLen, + (q - qi)); } else { int l, r; cin >> l >> r; int answer = BITquery(l, r); if(query(l, r - 1).pref == r - l) answer -= (q - qi); cout << answer << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...