제출 #516842

#제출 시각아이디문제언어결과실행 시간메모리
516842blue가로등 (APIO19_street_lamps)C++17
20 / 100
97 ms8780 KiB
#include <iostream> #include <vector> #include <string> #include <algorithm> #include <set> using namespace std; using vi = vector<int>; using vvi = vector<vi>; using pii = pair<int, int>; using vpii = vector<pii>; const int mx = 100; int n, q; int s[1+mx]; set<int> offpoints; int Z = (1<<19); struct stamp_tree { vi stamp = vi(Z<<1, 0); void set(int l, int r, int t) { l += Z; r += Z+1; while(l < r) { if(l & 1) stamp[l++] = t; if(r & 1) stamp[--r] = t; l >>= 1; r >>= 1; } } int query(int i) { int ans = 0; for(i += Z; i >= 1; i >>= 1) ans = max(ans, stamp[i]); return ans; } }; stamp_tree stt; struct segtree2 { // vvi toggle_stamp = vvi(1+mx, vi(1+mx, 0)); vvi total_time = vvi(1+mx, vi(1+mx, 0)); void add_triangle(int l, int r, int t) { // for(int i = l; i <= r; i++) // for(int j = l; j <= r; j++) // toggle_stamp[i][j] = t; stt.set(l, r, t); } void remove_triangle(int l, int r, int t) { // int tt = toggle_stamp[l][r]; int tt = stt.query(l); for(int i = l; i <= r; i++) for(int j = l; j <= r; j++) { total_time[i][j] += t - tt; } } void init() { ; } void switch_on(int i, int t) { offpoints.erase(i); auto it = offpoints.lower_bound(i); int r = *it; it--; int l = *it; remove_triangle(l+1, i-1, t); remove_triangle(i+1, r-1, t); add_triangle(l+1, r-1, t); } void switch_off(int i, int t) { auto it = offpoints.lower_bound(i); int r = *it; it--; int l = *it; offpoints.insert(i); remove_triangle(l+1, r-1, t); add_triangle(l+1, i-1, t); add_triangle(i+1, r-1, t); } int query(int l, int r, int t) { int y = *offpoints.lower_bound(l); if(y > r) return total_time[l][r] + t - stt.query(l); else return total_time[l][r]; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> q; string t; cin >> t; for(int i = 0; i < n; i++) s[i+1] = (t[i] == '1'); for(int i = 1; i <= n; i++) if(s[i] == 0) offpoints.insert(i); offpoints.insert(0); offpoints.insert(n+1); segtree2 S; S.init(); for(int j = 1; j <= q; j++) { string qr; cin >> qr; if(qr == "toggle") { int i; cin >> i; if(s[i] == 0) { s[i] = 1; S.switch_on(i, j); } else { s[i] = 0; S.switch_off(i, j); } } else { int a, b; cin >> a >> b; cout << S.query(a, b-1, j) << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...