Submission #1200075

#TimeUsernameProblemLanguageResultExecution timeMemory
1200075ByeWorldJoker (BOI20_joker)C++20
100 / 100
368 ms8364 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define fi first #define se second #define lf (id<<1) #define rg ((id<<1)|1) #define md ((l+r)>>1) #define ld long double const int MAXN = 2e5+10; const int MAXA = 250001; using namespace std; const int INF = 1e9; typedef pair<int,int> pii; typedef pair<int,pii> ipii; int n; vector<int> snapshot; struct dsu { int par[MAXN], siz[MAXN], cc; bool off[MAXN]; vector<array<int,4>> roll; void bd(){ cc = n; for(int i=1; i<=n+5; i++) par[i] = i, siz[i] = 1; } pii f(int x){ bool ret = 0; while(par[x]!=x){ ret ^= off[x]; x = par[x]; } return pii(x, ret); } bool mer(int _x, int _y){ pii x = f(_x), y = f(_y); if(x.fi==y.fi){ roll.pb({-1,-1,-1,-1}); if(x.se == y.se) return 0; // invalid return 1; } cc--; if(siz[x.fi] > siz[y.fi]) swap(x, y); // x->y roll.pb({x.fi, siz[x.fi], y.fi, siz[y.fi]}); off[x.fi] = x.se^y.se^1; siz[y.fi] += siz[x.fi]; par[x.fi] = y.fi; return 1; } void rb(){ if(roll.empty()){ cout << "jnck\n"; assert(false); } auto ba = roll.back(); roll.pop_back(); if(ba[0] == -1) return; cc++; siz[ba[2]] = ba[3]; siz[ba[0]] = ba[1]; par[ba[0]] = ba[0]; } void until(int x){ while(roll.size() != x) rb(); } } DSU; int m, Q, las[MAXN]; // las[l] = x, 1 - l-1, x+1 - m, bipart int u[MAXN], v[MAXN]; bool add(int id){ return DSU.mer(u[id], v[id]); } void DNC(int l, int r, int x, int y){ // 1-l-1, y+1,m if(l>r) return; int mid = md, siz = DSU.roll.size(); bool bip = 1; for(int i=l; i<=mid-1; i++) bip &= add(i); int siz2 = DSU.roll.size(); // cout << bip <<' ' <<mid << ' ' <<x<<' ' <<y<<" mid\n"; if(!bip){ for(int i=mid; i<=m; i++) las[i] = y; } else { int ret = y; while(x <= ret){ las[mid] = ret; if(!add(ret)) break; ret--; } // cout << " her\n"; DSU.until(siz2); if(!add(mid)){ for(int i=mid+1; i<=m; i++) las[i] = y; } else { DNC(mid+1, r, las[mid], y); } } DSU.until(siz); for(int i=y; i>=las[mid]+1; i--) add(i); DNC(l, mid-1, x, las[mid]); DSU.until(siz); } signed main(){ cin>>n>>m>>Q; DSU.bd(); for(int i=1; i<=m; i++)cin>>u[i]>>v[i]; u[m+1] = n+3; v[m+1] = n+4; bool bi = 1; for(int i=1; i<=m; i++) bi &= add(i); if(!bi){ DSU.until(0); DNC(1,m,1,m+1); } // for(int i=1; i<=m; i++) // cout << i << ' ' << las[i] << " las\n"; while(Q--){ int l, r; cin>>l>>r; cout << (las[l] <= r ? "NO\n" : "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...