Submission #502842

#TimeUsernameProblemLanguageResultExecution timeMemory
502842GurbanInside information (BOI21_servers)C++17
50 / 100
252 ms59468 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int B = 21; const int maxn=2e5+5; int n,k; int p[maxn]; int L[maxn]; int par[B][maxn]; pair<int,int> sp[2][B][maxn]; vector<pair<int,int>>E[maxn]; int ata(int nd){ if(p[nd] == nd) return nd; return p[nd] = ata(p[nd]); } void dfs(int nd,int pr){ par[0][nd] = pr; L[nd] = L[pr] + 1; for(auto i : E[nd]){ if(i.first != pr){ sp[0][0][i.first] = {1,i.second}; sp[1][0][i.first] = {1,i.second}; dfs(i.first,nd); } } } bool LCA(int a,int b){ bool tr = 1; int cep = 1e9; int sag = 0; if(L[a] > L[b]){ for(int i = B-1;i >= 0;i--){ if(par[i][a] and L[a] - (1<<i) >= L[b]){ tr &= sp[0][i][a].first; tr &= (cep > sp[0][0][a].second); cep = sp[0][i][a].second; a = par[i][a]; if(!tr) return 0; } } } else if(L[b] > L[a]){ for(int i = B-1;i >= 0;i--){ if(par[i][b] and L[b] - (1<<i) >= L[a]){ tr &= sp[1][i][b].first; tr &= (sag < sp[1][0][b].second); sag = sp[1][i][b].second; b = par[i][b]; if(!tr) return 0; } } } if(a == b) return tr; for(int i = B-1;i >= 0;i--){ if(par[i][a] and par[i][b] and par[i][a] != par[i][b]){ tr &= sp[0][i][a].first; tr &= sp[1][i][b].first; tr &= (cep > sp[0][0][a].second); tr &= (sag < sp[1][0][b].second); if(!tr) return 0; // assert(sp[0][0][a].second >= sp[0][i][a].second); // assert(sp[1][0][b].second <= sp[1][i][b].second); cep = sp[0][i][a].second; sag = sp[1][i][b].second; a = par[i][a]; b = par[i][b]; } } tr &= (cep > sp[0][0][a].second); tr &= (sag < sp[1][0][b].second); tr &= (sp[0][0][a].second > sp[1][0][b].second); return tr; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for(int i = 1;i <= n;i++) p[i] = i; vector<tuple<int,int,int>>quer; for(int i = 1;i < n + k;i++){ char tp; cin >> tp; if(tp == 'S'){ int x,y; cin >> x >> y; E[x].push_back({y,i}); E[y].push_back({x,i}); quer.push_back({0,x,y}); } else if(tp == 'Q'){ int x,y; cin >> x >> y; quer.push_back({1,x,y}); } else { int x; cin >> x; quer.push_back({2,x,-1}); } } dfs(1,0); for(int i = 1;i < B;i++){ for(int j = 1;j <= n;j++){ par[i][j] = par[i-1][par[i-1][j]]; if(!par[i][j]) continue; if(sp[0][i-1][j].first and sp[0][i-1][par[i-1][j]].first and sp[0][i-1][j].second > sp[0][0][par[i-1][j]].second){ sp[0][i][j] = {1,sp[0][i-1][par[i-1][j]].second}; } if(sp[1][i-1][j].first and sp[1][i-1][par[i-1][j]].first and sp[1][i-1][j].second < sp[1][0][par[i-1][j]].second){ sp[1][i][j] = {1,sp[1][i-1][par[i-1][j]].second}; } } } // for(int i = 0;i < B;i++){ // for(int j = 1;j <= n;j++){ // if(par[i][j]) cout<<i<<' '<<j<<' '<<par[i][j]<<' '<<sp[0][i][j].first<<' '<<sp[0][i][j].second<<' '<<sp[1][i][j].first<<' '<<sp[1][i][j].second<<'\n'; // } // } for(auto i : quer){ int tp = get<0>(i); int x = get<1>(i); int y = get<2>(i); if(tp == 0){ int aa = ata(x); int bb = ata(y); p[bb] = aa; } else if(tp == 1){ int aa = ata(x); int bb = ata(y); if(aa != bb){ cout<<"no\n"; continue; } cout<<(LCA(x,y)?"yes\n":"no\n"); } else cout<<"0\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...
#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...