Submission #962036

#TimeUsernameProblemLanguageResultExecution timeMemory
962036pccJoker (BOI20_joker)C++17
25 / 100
403 ms33240 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #define fs first #define sc second #define tlll tuple<ll,ll,ll> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,popcnt,sse4") const int mxn = 4e5+30; int N,M,Q; struct DSU{ vector<pii> sop,dop; vector<int> cop; bool cyc; int dsu[mxn],sz[mxn]; void init(int n){ cyc = false; for(int i = 0;i<=n;i++)dsu[i] = i,sz[i] = 1; } int root(int k){ return k == dsu[k]?k:root(dsu[k]); } void onion(int a,int b){ a = root(a),b = root(b); if(a == b){ sop.push_back(pii(0,0)); dop.push_back(pii(0,0)); return; } if(sz[a]<sz[b])swap(a,b); sop.push_back(pii(a,sz[a])); dop.push_back(pii(b,b)); dsu[b] = a; sz[a] += sz[b]; return; } void roll(){ for(int i = 0;i<2;i++){ { auto [a,b] = sop.back();sop.pop_back(); sz[a] = b; }{ auto [a,b] = dop.back();dop.pop_back(); dsu[a] = b; }{ auto a = cop.back();cop.pop_back(); cyc = a; }} return; } void add_edge(int a,int b){ onion(a,b+N); onion(b,a+N); cop.push_back(cyc); if(root(a) == root(a+N))cyc = true; cop.push_back(cyc); if(root(b) == root(b+N))cyc = true; assert(cop.size() == dop.size()); return; } }; DSU dsu; pii edges[mxn]; pii req[mxn]; int rp[mxn]; void dc(int l,int r,int sl,int sr){ //cerr<<l<<' '<<r<<':'<<sl<<' '<<sr<<endl; if(l == r){ for(int i = sl;i<=sr;i++){ rp[i] = l; } return; } int mid = (l+r)>>1; bool f = false; for(int i = r;i>mid;i--){ auto [a,b] = edges[i]; dsu.add_edge(a,b); } //cerr<<l<<' '<<mid<<' '<<r<<":"<<sl<<' '<<sr<<','<<dsu.cyc<<endl; //for(int i = 1;i<=N;i++)cerr<<dsu.root(i)<<' ';cerr<<endl; if(dsu.cyc){ for(int i = r;i>mid;i--){ dsu.roll(); } dc(mid+1,r,sl,sr); return; } int opt = sl; for(int i = sl;i<=sr;i++){ auto [a,b] = edges[i]; dsu.add_edge(a,b); opt = i; if(dsu.cyc)break; } for(int i = sl;i<=opt;i++){ dsu.roll(); } if(sl != opt)dc(l,mid,sl,opt-1); for(int i = r;i>mid;i--){ dsu.roll(); } for(int i = sl;i<opt;i++){ auto [a,b] = edges[i]; dsu.add_edge(a,b); } dc(mid+1,r,opt,sr); for(int i = sl;i<opt;i++){ dsu.roll(); } return; } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>N>>M>>Q; for(int i = 1;i<=M;i++)cin>>edges[i].fs>>edges[i].sc; for(int i = 1;i<=Q;i++)cin>>req[i].fs>>req[i].sc; edges[M+2] = edges[0] = edges[M+1] = pii(N+1,N+2); N += 2; dsu.init(N*2+10); dc(0,M+1,0,M); //for(int i = 0;i<=M;i++)cerr<<rp[i]<<' ';cerr<<endl; for(int i = 1;i<=Q;i++){ auto [s,e] = req[i]; if(rp[s-1]>=e+1)cout<<"YES\n"; else cout<<"NO\n"; } return 0; }

Compilation message (stderr)

Joker.cpp: In function 'void dc(int, int, int, int)':
Joker.cpp:82:7: warning: unused variable 'f' [-Wunused-variable]
   82 |  bool f = false;
      |       ^
#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...