제출 #746748

#제출 시각아이디문제언어결과실행 시간메모리
746748OlympiaRadio (COCI22_radio)C++17
10 / 110
1575 ms15332 KiB
#include <vector> #include <iostream> #include <cassert> #include <cmath> #include <map> #include <set> using namespace std; struct SegmentTree { vector<int> vec; const int id = 0; int merge (int x, int y) { return x + y; } void update (int x, int y) { x += (int)vec.size()/2 - 1; vec[x] = y; while (x != 0) { x = (x - 1)/2; vec[x] = merge(vec[2 * x + 1], vec[2 * x + 2]); } } int query (int dum, int tl, int tr, int l, int r) { if (tl >= l and tr <= r) { return vec[dum]; } if (tl > r or tr < l) { return id; } return merge(query(2 * dum + 1, tl, (tl + tr)/2, l, r), query(2 * dum + 2, (tl + tr)/2 + 1, tr, l, r)); } int query (int l, int r) { return query(0, 0, (int)vec.size()/2 - 1, l, r); } SegmentTree (int n) { n = (1 << ((int)log2(n) + 1)); vec.assign(2 * n, 0); } }; struct SegmentTreeMin { vector<int> vec; const int id = (int)1e9; int merge (int x, int y) { return min(x, y); } void update (int x, int y) { x += (int)vec.size()/2 - 1; vec[x] = y; while (x != 0) { x = (x - 1)/2; vec[x] = merge(vec[2 * x + 1], vec[2 * x + 2]); } } int query (int dum, int tl, int tr, int l, int r) { if (tl >= l and tr <= r) { return vec[dum]; } if (tl > r or tr < l) { return id; } return merge(query(2 * dum + 1, tl, (tl + tr)/2, l, r), query(2 * dum + 2, (tl + tr)/2 + 1, tr, l, r)); } int query (int l, int r) { return query(0, 0, (int)vec.size()/2 - 1, l, r); } SegmentTreeMin (int n) { n = (1 << ((int)log2(n) + 1)); vec.assign(2 * n, id); } }; struct SegmentTreeMax { vector<int> vec; const int id = -(int)1e9; int merge (int x, int y) { return max(x, y); } void update (int x, int y) { x += (int)vec.size()/2 - 1; vec[x] = y; while (x != 0) { x = (x - 1)/2; vec[x] = merge(vec[2 * x + 1], vec[2 * x + 2]); } } int query (int dum, int tl, int tr, int l, int r) { if (tl >= l and tr <= r) { return vec[dum]; } if (tl > r or tr < l) { return id; } return merge(query(2 * dum + 1, tl, (tl + tr)/2, l, r), query(2 * dum + 2, (tl + tr)/2 + 1, tr, l, r)); } int query (int l, int r) { return query(0, 0, (int)vec.size()/2 - 1, l, r); } SegmentTreeMax (int n) { n = (1 << ((int)log2(n) + 1)); vec.assign(2 * n, id); } }; int main () { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, Q; cin >> N >> Q; vector<vector<int>> queries; vector<bool> ans; ans.assign(Q, false); vector<int> factors(N + 1); vector<bool> isPrime(N + 1); isPrime.assign(N + 1, true); factors[1] = 1; for (int i = 2; i <= N; i++) { if (not isPrime[i]) { continue; } for (int j = i; j <= N; j += i) { factors[j] = i; isPrime[j] = false; } } while (Q--) { char c; cin >> c; if (c == 'C') { int x, y; cin >> x >> y; queries.push_back({--x, --y}); } else { int x; cin >> x; queries.push_back({--x}); } } vector<bool> act; int mx = 2; for (int i = 2; i * i <= N; i++) { mx = i; act.assign(N, false); SegmentTree st(N); for (int j = 0; j < queries.size(); j++) { auto q = queries[j]; if (q.size() == 1) { if ((q[0] + 1) % i == 0) { if (!act[q[0]]) { st.update(q[0], 1); } else { st.update(q[0], 0); } act[q[0]] = not act[q[0]]; } } else { int l = q[0], r = q[1]; if (st.query(l, r) >= 2) { ans[j] = true; } } } } //array of values[] //check if it is all discint SegmentTreeMin next_oc(N + 1); set<int> oc[N]; act.assign(N, false); for (int i = 0; i < queries.size(); i++) { auto q = queries[i]; if (q.size() == 1) { if ((q[0] + 1) * (q[0] + 1) < N) { continue; } int x = q[0]; if (act[x]) { oc[factors[x + 1]].erase(q[0]); next_oc.update(x, next_oc.id); auto it = oc[factors[x + 1]].lower_bound(q[0]); if (it != oc[factors[x + 1]].begin()) { --it; next_oc.update(*it, next_oc.id); } } else { oc[factors[x + 1]].insert(q[0]); auto it = oc[factors[x + 1]].upper_bound(q[0]); if (it != oc[factors[x + 1]].end()) { next_oc.update(x, *it); } it = oc[factors[x + 1]].lower_bound(q[0]); if (it != oc[factors[x + 1]].begin()) { --it; next_oc.update(*it, x); } } act[q[0]] = not act[q[0]]; } else { int l = q[0], r = q[1]; int res = next_oc.query(l, r); if (res <= r) { ans[i] = 1; } } } for (int i = 0; i < queries.size(); i++) { if (queries[i].size() == 2) { cout << (ans[i] ? "DA" : "NE") << '\n'; } } }

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

Main.cpp: In function 'int main()':
Main.cpp:143:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  143 |         for (int j = 0; j < queries.size(); j++) {
      |                         ~~^~~~~~~~~~~~~~~~
Main.cpp:167:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  167 |     for (int i = 0; i < queries.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~~
Main.cpp:203:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  203 |     for (int i = 0; i < queries.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~~
Main.cpp:138:9: warning: variable 'mx' set but not used [-Wunused-but-set-variable]
  138 |     int mx = 2;
      |         ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...