제출 #516905

#제출 시각아이디문제언어결과실행 시간메모리
516905blueStreet Lamps (APIO19_street_lamps)C++17
컴파일 에러
0 ms0 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 = 300'000; 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; // vvi total_time = vvi(1+mx, vi(1+mx, 0)); struct col_tree { int lp = 0; col_tree* left = NULL; col_tree* right = NULL; col_tree() { ; } col_tree(int L, int R) { ; } void add(int l, int r, int L, int R, int V) { // cerr << "col add\n"; if(R < l || r < L) return; else if(L <= l && r <= R) { lp += V; } else { if(L <= (l+r)/2) { if(left == NULL) left = new col_tree(l, (l+r)/2); left->add(l, (l+r)/2, L, R, V); } if(R >= (l+r)/2+1) { if(right == NULL) right = new col_tree((l+r)/2+1, r); right->add((l+r)/2+1, r, L, R, V); } } } void add(int L, int R, int V) {add(1, n, L, R, V);} int query(int l, int r, int I) { // cerr << "col query\n"; if(l == r) return lp; else if(I <= (l+r)/2) { if(left == NULL) return lp; else return lp + left->query(l, (l+r)/2, I); } else { if(right == NULL) return lp; else return lp + right->query((l+r)/2+1, r, I); } } int query(int I) {return query(1, n, I);} }; struct row_tree { int l; int r; col_tree lp; row_tree* left = NULL; row_tree* right = NULL; row_tree() { ; } row_tree(int L, int R) { l = L; r = R; lp = col_tree(1, n); } void add(int L, int R, int X, int Y, int V) { if(R < l || r < L) return; else if(L <= l && r <= R) lp.add(X, Y, V); else { if(L <= (l+r)/2) { if(left == NULL) left = new row_tree(l, (l+r)/2); left->add(L, R, X, Y, V); } if(R > (l+r)/2) { if(right == NULL) right = new row_tree((l+r)/2+1, r); right->add(L, R, X, Y, V); } } } int query(int I, int J) { if(l == r) return lp.query(J); else if(I <= (l+r)/2) { if(left == NULL) return lp.query(J); else return left->query(I, J) + lp.query(J); } else { if(right == NULL) return lp.query(J); else return right->query(I, J) + lp.query(J); } } }; // col_tree ST[1+mx]; row_tree ST; int get_value(int l, int r) { // return ST[l].query(r); return ST.query(l, r); } void range_add(int l, int r, int x, int y, int v) { // for(int i = l; i <= r; i++) // ST[i].add(x, y, v); ST.add(l, r, x, y, v); } void add_triangle(int l, int r, int t) { stt.set(l, r, t); } void remove_triangle(int l, int r, int t) { int tt = stt.query(l); range_add(l, r, l, r, t - tt); } 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 get_value(l, r) + t - stt.query(l); else return get_value(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); // for(int i = 1; i <= n; i++) ST[i] = col_tree(1, n); ST = row_tree(1, n); 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; switch_on(i, j); } else { s[i] = 0; switch_off(i, j); } } else { int a, b; cin >> a >> b; cout << query(a, b-1, j) << '\n'; } } } #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 = 300'000; 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; // vvi total_time = vvi(1+mx, vi(1+mx, 0)); struct col_tree { int lp = 0; col_tree* left = NULL; col_tree* right = NULL; col_tree() { ; } col_tree(int L, int R) { ; } void add(int l, int r, int L, int R, int V) { // cerr << "col add\n"; if(R < l || r < L) return; else if(L <= l && r <= R) { lp += V; } else { if(L <= (l+r)/2) { if(left == NULL) left = new col_tree(l, (l+r)/2); left->add(l, (l+r)/2, L, R, V); } if(R >= (l+r)/2+1) { if(right == NULL) right = new col_tree((l+r)/2+1, r); right->add((l+r)/2+1, r, L, R, V); } } } void add(int L, int R, int V) {add(1, n, L, R, V);} int query(int l, int r, int I) { // cerr << "col query\n"; if(l == r) return lp; else if(I <= (l+r)/2) { if(left == NULL) return lp; else return lp + left->query(l, (l+r)/2, I); } else { if(right == NULL) return lp; else return lp + right->query((l+r)/2+1, r, I); } } int query(int I) {return query(1, n, I);} }; struct row_tree { int l; int r; col_tree lp; row_tree* left = NULL; row_tree* right = NULL; row_tree() { ; } row_tree(int L, int R) { l = L; r = R; lp = col_tree(1, n); } void add(int L, int R, int X, int Y, int V) { if(R < l || r < L) return; else if(L <= l && r <= R) lp.add(X, Y, V); else { if(L <= (l+r)/2) { if(left == NULL) left = new row_tree(l, (l+r)/2); left->add(L, R, X, Y, V); } if(R > (l+r)/2) { if(right == NULL) right = new row_tree((l+r)/2+1, r); right->add(L, R, X, Y, V); } } } int query(int I, int J) { if(l == r) return lp.query(J); else if(I <= (l+r)/2) { if(left == NULL) return lp.query(J); else return left->query(I, J) + lp.query(J); } else { if(right == NULL) return lp.query(J); else return right->query(I, J) + lp.query(J); } } }; // col_tree ST[1+mx]; row_tree ST; int get_value(int l, int r) { // return ST[l].query(r); return ST.query(l, r); } void range_add(int l, int r, int x, int y, int v) { // for(int i = l; i <= r; i++) // ST[i].add(x, y, v); ST.add(l, r, x, y, v); } void add_triangle(int l, int r, int t) { stt.set(l, r, t); } void remove_triangle(int l, int r, int t) { int tt = stt.query(l); range_add(l, r, l, r, t - tt); } 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 get_value(l, r) + t - stt.query(l); else return get_value(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); // for(int i = 1; i <= n; i++) ST[i] = col_tree(1, n); ST = row_tree(1, n); 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; switch_on(i, j); } else { s[i] = 0; switch_off(i, j); } } else { int a, b; cin >> a >> b; cout << query(a, b-1, j) << '\n'; } } }

컴파일 시 표준 에러 (stderr) 메시지

street_lamps.cpp:362:11: error: redefinition of 'const int mx'
  362 | const int mx = 300'000;
      |           ^~
street_lamps.cpp:13:11: note: 'const int mx' previously defined here
   13 | const int mx = 300'000;
      |           ^~
street_lamps.cpp:364:5: error: redefinition of 'int n'
  364 | int n, q;
      |     ^
street_lamps.cpp:15:5: note: 'int n' previously declared here
   15 | int n, q;
      |     ^
street_lamps.cpp:364:8: error: redefinition of 'int q'
  364 | int n, q;
      |        ^
street_lamps.cpp:15:8: note: 'int q' previously declared here
   15 | int n, q;
      |        ^
street_lamps.cpp:365:5: error: redefinition of 'int s [300001]'
  365 | int s[1+mx];
      |     ^
street_lamps.cpp:16:5: note: 'int s [300001]' previously declared here
   16 | int s[1+mx];
      |     ^
street_lamps.cpp:367:10: error: redefinition of 'std::set<int> offpoints'
  367 | set<int> offpoints;
      |          ^~~~~~~~~
street_lamps.cpp:18:10: note: 'std::set<int> offpoints' previously declared here
   18 | set<int> offpoints;
      |          ^~~~~~~~~
street_lamps.cpp:372:5: error: redefinition of 'int Z'
  372 | int Z = (1<<19);
      |     ^
street_lamps.cpp:23:5: note: 'int Z' previously defined here
   23 | int Z = (1<<19);
      |     ^
street_lamps.cpp:374:8: error: redefinition of 'struct stamp_tree'
  374 | struct stamp_tree
      |        ^~~~~~~~~~
street_lamps.cpp:25:8: note: previous definition of 'struct stamp_tree'
   25 | struct stamp_tree
      |        ^~~~~~~~~~
street_lamps.cpp:399:12: error: redefinition of 'stamp_tree stt'
  399 | stamp_tree stt;
      |            ^~~
street_lamps.cpp:50:12: note: 'stamp_tree stt' previously declared here
   50 | stamp_tree stt;
      |            ^~~
street_lamps.cpp:412:8: error: redefinition of 'struct col_tree'
  412 | struct col_tree
      |        ^~~~~~~~
street_lamps.cpp:63:8: note: previous definition of 'struct col_tree'
   63 | struct col_tree
      |        ^~~~~~~~
street_lamps.cpp:480:8: error: redefinition of 'struct row_tree'
  480 | struct row_tree
      |        ^~~~~~~~
street_lamps.cpp:131:8: note: previous definition of 'struct row_tree'
  131 | struct row_tree
      |        ^~~~~~~~
street_lamps.cpp:544:10: error: redefinition of 'row_tree ST'
  544 | row_tree ST;
      |          ^~
street_lamps.cpp:195:10: note: 'row_tree ST' previously declared here
  195 | row_tree ST;
      |          ^~
street_lamps.cpp:551:5: error: redefinition of 'int get_value(int, int)'
  551 | int get_value(int l, int r)
      |     ^~~~~~~~~
street_lamps.cpp:202:5: note: 'int get_value(int, int)' previously defined here
  202 | int get_value(int l, int r)
      |     ^~~~~~~~~
street_lamps.cpp:557:6: error: redefinition of 'void range_add(int, int, int, int, int)'
  557 | void range_add(int l, int r, int x, int y, int v)
      |      ^~~~~~~~~
street_lamps.cpp:208:6: note: 'void range_add(int, int, int, int, int)' previously defined here
  208 | void range_add(int l, int r, int x, int y, int v)
      |      ^~~~~~~~~
street_lamps.cpp:577:6: error: redefinition of 'void add_triangle(int, int, int)'
  577 | void add_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~
street_lamps.cpp:228:6: note: 'void add_triangle(int, int, int)' previously defined here
  228 | void add_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~
street_lamps.cpp:582:6: error: redefinition of 'void remove_triangle(int, int, int)'
  582 | void remove_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~~~~
street_lamps.cpp:233:6: note: 'void remove_triangle(int, int, int)' previously defined here
  233 | void remove_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~~~~
street_lamps.cpp:588:6: error: redefinition of 'void switch_on(int, int)'
  588 | void switch_on(int i, int t)
      |      ^~~~~~~~~
street_lamps.cpp:239:6: note: 'void switch_on(int, int)' previously defined here
  239 | void switch_on(int i, int t)
      |      ^~~~~~~~~
street_lamps.cpp:602:6: error: redefinition of 'void switch_off(int, int)'
  602 | void switch_off(int i, int t)
      |      ^~~~~~~~~~
street_lamps.cpp:253:6: note: 'void switch_off(int, int)' previously defined here
  253 | void switch_off(int i, int t)
      |      ^~~~~~~~~~
street_lamps.cpp:616:5: error: redefinition of 'int query(int, int, int)'
  616 | int query(int l, int r, int t)
      |     ^~~~~
street_lamps.cpp:267:5: note: 'int query(int, int, int)' previously defined here
  267 | int query(int l, int r, int t)
      |     ^~~~~
street_lamps.cpp:646:5: error: redefinition of 'int main()'
  646 | int main()
      |     ^~~~
street_lamps.cpp:297:5: note: 'int main()' previously defined here
  297 | int main()
      |     ^~~~