제출 #1183652

#제출 시각아이디문제언어결과실행 시간메모리
1183652ttamxJoker (BOI20_joker)C++20
0 / 100
2091 ms6084 KiB
#include<bits/stdc++.h> using namespace std; const int N=200005; int n,m,q; int eu[N],ev[N],opt[N]; struct DSU{ int p[N],sz[N],c[N]; bool ans; int t; vector<tuple<int,int,int,bool>> s; void init(){ for(int i=1;i<=n;i++)p[i]=i,sz[i]=1,c[i]=0; ans=true; t=0; s.clear(); } int fp(int u){return u==p[u]?u:fp(p[u]);} int col(int u){return c[u]^(u==p[u]?0:col(p[u]));} int uni(int i){ t++; int u=eu[i],v=ev[i]; int cu=col(u),cv=col(v); u=fp(u),v=fp(v); if(u==v){ if(cu==cv){ s.emplace_back(t,0,0,ans); ans=false; } }else{ if(sz[u]>sz[v])swap(u,v); if(cu==cv)c[v]^=1; sz[u]+=sz[v]; p[v]=u; s.emplace_back(t,u,v,ans); } return t; } void rollback(int x){ t=x; while(!s.empty()){ auto [tt,u,v,a]=s.back(); if(tt<=t)break; if(u){ sz[u]-=sz[v]; p[v]=v; } ans=a; s.pop_back(); } } }dsu; void dnc(int l,int r,int optl,int optr){ if(l>r)return; int m=(l+r)/2; opt[m]=optr; int t1=dsu.t; for(int i=l;i<m;i++)dsu.uni(i); int t2=dsu.t; while(dsu.ans&&opt[m]>=max(m,optl+1))dsu.uni(opt[m]--); dsu.rollback(t2); dsu.uni(m); dnc(m+1,r,opt[m],optr); dsu.rollback(t1); dnc(l,m-1,optl,opt[m]); } int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> m >> q; for(int i=1;i<=m;i++)cin >> eu[i] >> ev[i]; dsu.init(); dnc(1,m,0,m); while(q--){ int l,r; cin >> l >> r; cout << (opt[l]>=r?"YES":"NO") << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...