제출 #973353

#제출 시각아이디문제언어결과실행 시간메모리
973353vladiliusJoker (BOI20_joker)C++17
100 / 100
430 ms23628 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define pb push_back #define ff first #define ss second struct dsu{ vector<pair<int&, int>> hist; vector<int> sz, p; vector<bool> f; int n; dsu(int ns){ n = ns; p.resize(2 * n + 1); sz.resize(2 * n + 1); for (int i = 1; i <= 2 * n; i++){ p[i] = i; sz[i] = 1; } } int get(int v){ if (p[v] != v){ return get(p[v]); } return v; } int op(int v){ return v + n; } void unite(int x, int y){ x = get(x); y = get(y); if (x == y) return; if (sz[x] > sz[y]) swap(x, y); hist.pb({p[x], p[x]}); hist.pb({sz[y], sz[y]}); p[x] = y; sz[y] += sz[x]; } bool add(pii P){ auto [x, y] = P; if (!x) return 0; unite(x, op(y)); unite(y, op(x)); bool k = ((!f.empty() && f.back()) | (get(x) == get(y))); f.pb(k); return k; } void roll_back(int S, int Sf){ while (hist.size() != S){ hist.back().ff = hist.back().ss; hist.pop_back(); } while (f.size() != Sf){ f.pop_back(); } } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, M, q; cin>>n>>M>>q; vector<pii> ed = {{0, 0}}; for (int i = 1; i <= M; i++){ int u, v; cin>>u>>v; ed.pb({u, v}); } dsu T(n); for (int i = 1; i <= M; i++){ T.add(ed[i]); } if (!T.f.back()){ for (int i = 1; i <= q; i++){ cout<<"NO"<<"\n"; } return 0; } T.roll_back(0, 0); vector<int> last(M + 1); function<void(int, int, pii)> solve = [&](int l, int r, pii R){ if (l > r) return; int m = (l + r) / 2; int S = (int) T.hist.size(), Sf = (int) T.f.size(); for (int i = l; i < m; i++){ T.add(ed[i]); } int i = R.ss; while (T.f.empty() || !T.f.back()){ T.add(ed[i--]); } last[m] = i; T.roll_back(S, Sf); S = (int) T.hist.size(); Sf = (int) T.f.size(); for (int i = last[m] + 1; i <= R.ss; i++){ T.add(ed[i]); } solve(l, m - 1, {R.ff, last[m]}); T.roll_back(S, Sf); S = (int) T.hist.size(); Sf = (int) T.f.size(); for (int i = l; i <= m; i++){ T.add(ed[i]); } solve(m + 1, r, {last[m], R.ss}); T.roll_back(S, Sf); }; solve(1, M, {0, M}); while (q--){ int l, r; cin>>l>>r; cout<<((r <= last[l]) ? "YES" : "NO")<<"\n"; } }

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

Joker.cpp: In member function 'void dsu::roll_back(int, int)':
Joker.cpp:51:28: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int&, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   51 |         while (hist.size() != S){
      |                ~~~~~~~~~~~~^~~~
Joker.cpp:55:25: warning: comparison of integer expressions of different signedness: 'std::vector<bool>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   55 |         while (f.size() != Sf){
      |                ~~~~~~~~~^~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...