Submission #1204019

#TimeUsernameProblemLanguageResultExecution timeMemory
1204019UnforgettableplInside information (BOI21_servers)C++20
48 / 100
153 ms47348 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N,K; cin >> N >> K; vector<int> depth(N+1); vector lift(N+1,vector(17,0ll)); vector<int> maxup(N+1); vector<int> maxdown(N+1); vector<int> pEdge(N+1); vector<tuple<int,int,int>> queries; vector<vector<pair<int,int>>> adj(N+1); { int tim = 0; for(int i=1;i<=N-1+K;i++){ char t;cin>>t; if(t=='S'){ int a,b; cin >> a >> b; tim++; adj[a].emplace_back(b,tim); adj[b].emplace_back(a,tim); } else if(t=='Q'){ int a,d; cin >> a >> d; queries.emplace_back(tim,a,d); } else { int d; cin >> d; queries.emplace_back(tim,-1,d); } } } { function<void(int,int)> dfs = [&](int x,int p){ lift[x][0]=p; depth[x]=depth[p]+1; maxup[x]=depth[x]-1; if(pEdge[p]>pEdge[x])maxup[x]=maxup[p]; maxdown[x]=depth[x]-1; if(pEdge[p]<pEdge[x])maxdown[x]=maxdown[p]; for(auto&[i,cost]:adj[x])if(i!=p){ pEdge[i]=cost; dfs(i,x); } }; dfs(1,0); for(int bit=1;bit<17;bit++){ for(int i=1;i<=N;i++){ lift[i][bit]=lift[lift[i][bit-1]][bit-1]; } } } auto lcas = [&](int a,int b){ if(depth[b]<depth[a])swap(a,b); int target = depth[b]-depth[a]; for(int bit=0;bit<17;bit++)if(target&(1<<bit))b=lift[b][bit]; if(a==b)return a; for(int bit=16;bit>=0;bit--)if(lift[a][bit]!=lift[b][bit]){ a = lift[a][bit]; b = lift[b][bit]; } return lift[a][0]; }; for(auto&[tim,a,b]:queries){ if(a==-1){ // Count how many servers have b } else { int lca = lcas(a,b); swap(a,b); int aRaised = a; int target = max(0ll,depth[a]-depth[lca]-1); for(int bit=0;bit<17;bit++)if(target&(1<<bit))aRaised=lift[aRaised][bit]; int bRaised = b; target = max(0ll,depth[b]-depth[lca]-1); for(int bit=0;bit<17;bit++)if(target&(1<<bit))bRaised=lift[bRaised][bit]; if(depth[lca]<maxup[a]){ cout << "no\n"; continue; } if(depth[lca]<maxdown[b]){ cout << "no\n"; continue; } if(depth[lca]!=depth[b] and depth[lca]!=depth[a] and pEdge[bRaised]<pEdge[aRaised]){ cout << "no\n"; continue; } if(depth[lca]!=depth[b]){ if(pEdge[b]>tim){ cout << "no\n"; }else{ cout << "yes\n"; } continue; } if(depth[lca]==depth[b] and depth[lca]!=depth[a]){ if(pEdge[aRaised]>tim){ cout << "no\n"; }else{ cout << "yes\n"; } continue; } 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...
#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...