제출 #1127760

#제출 시각아이디문제언어결과실행 시간메모리
1127760Double_Slash가로등 (APIO19_street_lamps)C++17
100 / 100
2196 ms125856 KiB
#include <bits/stdc++.h> using namespace std; using pint = pair<int, int>; template <class T> struct Cc : vector<T> { using vector<T>::begin, vector<T>::end, vector<T>::erase; void init() { sort(begin(), end()); erase(unique(begin(), end()), end()); } int inc(const T &t) { return lower_bound(begin(), end(), t) - begin(); } int exc(const T &t) { return upper_bound(begin(), end(), t) - begin(); } }; struct St2 { int n; Cc<int> cc; vector<int> st; void add(int i) { cc.emplace_back(i); } void init() { cc.init(); n = cc.size(); st.resize(n << 1); } void update(int l, int r, int v) { for (l = cc.inc(l) + n, r = cc.exc(r) + n; l < r; l >>= 1, r >>= 1) { if (l & 1) st[l++] += v; if (r & 1) st[--r] += v; } } int query(int i) { int ret = 0; for (i = cc.inc(i) + n; i; i >>= 1) ret += st[i]; return ret; } }; struct St { int n; vector<St2> st; St(int n) : n(n), st(n << 1) {} void add(int i, int j) { for (i += n; i; i >>= 1) st[i].add(j); } void init() { for (int i = n << 1; --i;) st[i].init(); } void update(int l, int r, int l2, int r2, int v) { for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l & 1) st[l++].update(l2, r2, v); if (r & 1) st[--r].update(l2, r2, v); } } int query(int i, int j) { int ret = 0; for (i += n; i; i >>= 1) ret += st[i].query(j); return ret; } }; int n, q, a[300000], b[300000]; bool on[300000]; map<int, pint> ranges; int main() { cin >> n >> q; for (int i = 0; i < n; ++i) { char c; cin >> c; on[i] = c == '1'; if (on[i]) { if (ranges.empty() or ranges.rbegin()->second.first < i - 1) ranges[i] = {i, -1}; else ranges.rbegin()->second.first = i; } } St st{n}; for (int i = 0; i < q; ++i) { string s; cin >> s >> a[i]; a[i]--; if (s[0] == 't') b[i] = -1; else { cin >> b[i]; st.add(a[i], b[i] -= 2); } } st.init(); for (int i = 0; i < q; ++i) { auto rem = [&] (int l) { auto [r, t] = ranges[l]; st.update(l, n, 0, r, i - t); ranges.erase(l); }; if (~b[i]) { int ans = st.query(a[i], b[i]); auto it = ranges.upper_bound(a[i]); if (it != ranges.begin() and (--it)->second.first >= b[i]) ans += i - it->second.second; cout << ans << '\n'; } else if (on[a[i]]) { on[a[i]] = false; int l = prev(ranges.upper_bound(a[i]))->first; int r = ranges[l].first; rem(l); if (l < a[i]) ranges[l] = {a[i] - 1, i}; if (a[i] < r) ranges[a[i] + 1] = {r, i}; } else { on[a[i]] = true; int l = a[i], r = a[i]; auto it = ranges.upper_bound(r); if (it != ranges.end() and it->first == r + 1) { r = it++->second.first; rem(a[i] + 1); } if (it != ranges.begin() and (--it)->second.first == l - 1) rem(l = it->first); ranges[l] = {r, i}; } } }
#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...