Submission #817856

#TimeUsernameProblemLanguageResultExecution timeMemory
817856MohamedAhmed04Inside information (BOI21_servers)C++14
65 / 100
3570 ms49408 KiB
#include <bits/stdc++.h> using namespace std ; const int MAX = 3e5 + 10 ; const int B = 2004 ; int n , q ; vector< vector< pair<int , int> > >adj(MAX) ; vector< vector<int> >adj2(MAX) ; int val[MAX] , up_inc[MAX] , up_dec[MAX] ; int dep[MAX] , P[MAX][18] ; int in[MAX] , out[MAX] ; int tim = 0 ; void dfs(int node , int par) { in[node] = ++tim ; P[node][0] = par ; for(int i = 1 ; i < 18 ; ++i) P[node][i] = P[P[node][i-1]][i-1] ; up_inc[node] = up_dec[node] = par ; if(val[node] < val[par]) up_inc[node] = up_inc[par] ; else up_dec[node] = up_dec[par] ; for(auto &childd : adj[node]) { int child = childd.first , y = childd.second ; if(child == par) continue ; dep[child] = dep[node] + 1 , val[child] = y ; dfs(child , node) ; } out[node] = tim ; } bool Ancestor(int x , int y) { return (in[y] >= in[x] && in[y] <= out[x]) ; } bool check(int x , int y , int tim) // x has server y { if(x == y) return true ; if((!Ancestor(up_inc[y] , x))) return false ; if((!Ancestor(up_dec[x] , y))) return false ; if(Ancestor(y , x)) return (val[x] <= tim) ; if((!Ancestor(x , y)) && val[x] > tim) return false ; bool flag = false ; if(dep[x] < dep[y]) swap(x , y) , flag = true ; for(int k = 17 ; k >= 0 ; --k) { if(dep[x] - (1 << k) > dep[y]) x = P[x][k] ; } if(P[x][0] == y) return (val[x] <= tim) ; if(dep[x] != dep[y]) x = P[x][0] ; if(flag) swap(x , y) ; for(int k = 17 ; k >= 0 ; --k) { if(P[x][k] != P[y][k]) x = P[x][k] , y = P[y][k] ; } return (val[x] > val[y]) ; } int dp[MAX] , dpup[MAX] , dpdown[MAX] ; int vis[MAX] ; void dfs2(int node , int par) { vis[node] = 1 ; dpdown[node] = dp[node] = 1 ; for(auto &child : adj2[node]) { if(child == par) continue ; dfs2(child , node) ; if(val[child] > val[node]) dpdown[node] += dpdown[child] ; dp[node] += dpdown[child] ; } } void dfs3(int node , int par , int sum) { dpup[node] = sum + (par != node) ; if(val[par] > val[node]) dpup[node] += dpup[par] ; dp[node] += dpup[node] ; int sz = adj2[node].size() , sum2 = 0 ; for(int i = sz-1 ; i >= 0 ; --i) { int child = adj2[node][i] ; if(child == par) continue ; dfs3(child , node , sum2) ; sum2 += dpdown[child] ; } } void calc() { for(int i = 1 ; i <= n ; ++i) vis[i] = 0 ; for(int i = 1 ; i <= n ; ++i) { if(vis[i]) continue ; dfs2(i , i) ; dfs3(i , i , 0) ; } } char ch[MAX] ; int X[MAX] , Y[MAX] ; int main() { ios_base::sync_with_stdio(0) ; cin.tie(0) ; cin>>n>>q ; for(int i = 1 ; i <= n+q-1 ; ++i) { cin>>ch[i] ; if(ch[i] == 'S') { cin>>X[i]>>Y[i] ; adj[X[i]].emplace_back(Y[i] , i) ; adj[Y[i]].emplace_back(X[i] , i) ; } else if(ch[i] == 'Q') cin>>X[i]>>Y[i] ; else if(ch[i] == 'C') cin>>X[i] ; } dfs(1 , 1) ; for(int i = 1 ; i <= n ; ++i) dp[i] = 1 ; int cnt = 0 ; vector<int>v ; for(int i = 1 ; i <= n+q-1 ; ++i) { if(cnt == B) calc() , cnt = 0 , v.clear() ; if(ch[i] == 'S') { v.push_back(i) ; adj2[X[i]].push_back(Y[i]) ; adj2[Y[i]].push_back(X[i]) ; cnt++ ; } else if(ch[i] == 'Q') { if(check(X[i] , Y[i] , i)) cout<<"yes\n" ; else cout<<"no\n" ; } else if(ch[i] == 'C') { int ans = dp[X[i]] ; for(auto &j : v) { int a = X[j] , b = Y[j] ; if(val[a] != j) swap(a , b) ; if(check(a , X[i] , i) && (!Ancestor(a , X[i]))) ans++ ; else if(check(b , X[i] , i) && Ancestor(a , X[i])) ans++ ; } cout<<ans<<"\n" ; } } return 0 ; }
#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...