Submission #871024

#TimeUsernameProblemLanguageResultExecution timeMemory
871024NaimSSJoker (BOI20_joker)C++14
14 / 100
2075 ms27264 KiB
#include <bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<(b);++i) #define pb push_back #define ld long double #define ff first #define ss second #define endl '\n' #define sz(v) ((int)v.size()) #define all(v) begin(v),end(v) using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef vector<int> vi; typedef vector<ll> vl; void dbg_out() { cerr << endl ;} template<typename Head, typename... Tail> void dbg_out(Head H,Tail... T){ cerr<<' '<<H ; dbg_out(T...); } #ifdef LOCAL #define dbg(...) cerr<<"("<< #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__), cerr << endl; #else #define dbg(...) 42 #endif struct event{ int a,b,psb,pa,corA,is_good; event(int a,int b,int psb,int pa,int corA,int is_good): a(a),b(b),psb(psb),pa(pa),corA(corA), is_good(is_good){} }; struct DSU{ vector<event> st; int is_good; int n; vi p,ps,ar; DSU(int n):n(n){ p = ps = vi(n+1,1); ar = vi(n+1,0); rep(i,0,n+1)p[i] = i; is_good = 1; } pii find(int x){ int val=0; while(x!=p[x]){ val^=ar[x]; x = p[x]; } return pii(x,val); } int f(int x){return find(x).ff;} int cor(int x){return find(x).ss;} bool join(int a,int b){ if(ps[f(a)] > ps[f(b)])swap(a,b); int ca = cor(a),cb = cor(b); a = f(a),b = f(b); st.pb(event(a,b,ps[b],p[a],ar[a],is_good)); if(a == b){ if(ca == cb)is_good = 0; return 0; } ps[b] += ps[a], p[a] = b; ar[a] = (ca^cb^1); return 1; } void undo(){ auto [a,b,psb,pa,corA,Isgood] = st.back(); p[a] = pa,ps[b] = psb,is_good = Isgood; ar[a] = corA; st.pop_back(); } void clear(){ while(sz(st))undo(); } int ok(){return is_good;} }; const int N = 2 * (200100); const int SQ = 400; int a[N], b[N]; struct query{ int l,r,id; query(int l,int r,int id):l(l),r(r),id(id){} }; vector<query> Q[N]; int res[N]; int32_t main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n,m,q; cin >> n >> m >> q; rep(i,1,m+1){ cin >> a[i] >> b[i]; a[i + m] = a[i], b[i+m] = b[i]; } rep(i,1,q+1){ int l,r; cin >> l >> r; if( l == 1 && r == m){ res[i] = 1; continue; } Q[(r+1)/SQ].pb(query(r+1,l+m-1,i)); } DSU d(n); for(int bk=0;bk<N;bk++){ if(sz(Q[bk])==0)continue; d.clear(); sort(all(Q[bk]),[&](query a,query b){ return a.r < b.r; }); int ptr = (bk + 1) * SQ; int lB = ptr - 1; for(auto q : Q[bk]){ int l = q.l,r = q.r; assert(l <= r); while(ptr <= r){ d.join(a[ptr], b[ptr]); ptr++; } int qtd=0; for(int i=min(r,lB);i >= l; i--){ d.join(a[i], b[i]); qtd++; } res[q.id] = d.ok(); while(qtd--)d.undo(); } } rep(i,1,q+1){ cout << (res[i] == 1 ? "NO" : "YES") << endl; } }

Compilation message (stderr)

Joker.cpp: In member function 'void DSU::undo()':
Joker.cpp:69:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   69 |   auto [a,b,psb,pa,corA,Isgood] = st.back();
      |        ^
#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...