Submission #1212137

#TimeUsernameProblemLanguageResultExecution timeMemory
1212137MalixJoker (BOI20_joker)C++20
100 / 100
544 ms19896 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vii; typedef pair<int,int> pi; typedef vector<pi> pii; typedef tuple<int,int,int> ti; typedef vector<ll> li; typedef vector<li> lii; #define REP(i,a,b) for(int i=a;i<b;i++) #define F first #define S second #define PB push_back #define LSOne(s) ((s)&(-s)) ll INF=1000000000000000010; int inf=1e9+10; ll M=1e9+7; int n,m,q; pii a; vi p,s,t,ans; vector<pi> c,d,e; pi parent(int x){ if(p[x]==x)return {x,0}; pi X=parent(p[x]); c.PB({x,p[x]}); e.PB({x,t[x]}); p[x]=X.F; t[x]^=X.S; return {p[x],t[x]}; } bool merge(pi ed){ int x=ed.F,y=ed.S; int u=x,v=y; pi X=parent(x),Y=parent(y); if(X.F==Y.F)return t[x]==t[y]; x=X.F;y=Y.F; if(s[x]<s[y])swap(x,y); c.PB({y,p[y]}); d.PB({x,s[x]}); e.PB({y,t[y]}); s[x]+=s[y]; p[y]=x; t[y]=t[u]^t[v]^1; return 0; } void clr(int x,int y,int z){ while(c.size()>x){ p[c.back().F]=c.back().S; c.pop_back(); } while(d.size()>y){ s[d.back().F]=d.back().S; d.pop_back(); } while(e.size()>z){ t[e.back().F]=e.back().S; e.pop_back(); } } void solve(int x1,int x2,int y1,int y2){ if(x2<x1)return; int m=(x1+x2)/2; int pos=y2; bool f=0; int nm1=c.size(),nm2=d.size(),nm3=e.size(); REP(i,x1,m)merge(a[i]); while(f==0&&y1<=pos)f|=merge(a[pos--]); ans[m]=pos; clr(nm1,nm2,nm3); pos++; if(x1==x2)return; nm1=c.size(),nm2=d.size(),nm3=e.size(); REP(i,pos+1,y2+1)merge(a[i]); solve(x1,m-1,y1,pos); clr(nm1,nm2,nm3); nm1=c.size(),nm2=d.size(),nm3=e.size(); REP(i,x1,m+1)merge(a[i]); solve(m+1,x2,pos,y2); clr(nm1,nm2,nm3); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>q; a.resize(m); p.resize(n);t.resize(n,0);s.resize(n,1); REP(i,0,n)p[i]=i; REP(i,0,m){ int x,y;cin>>x>>y; x--;y--; a[i]={x,y}; } ans.resize(m,-1); int k=m; bool fl=0; REP(i,0,m-1){ fl|=merge(a[i]); if(fl){ k=i; break; } } clr(0,0,0); REP(i,k+1,m)ans[i]=m-1; if(k>=0)solve(0,k,0,m-1); REP(i,0,q){ int x,y;cin>>x>>y; x--;y--; if(ans[x]<y)cout<<"NO\n"; else cout<<"YES\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...