Submission #1178377

#TimeUsernameProblemLanguageResultExecution timeMemory
1178377emptypringlescanThe Ties That Guide Us (CEOI23_incursion)C++17
100 / 100
151 ms6760 KiB
#include <bits/stdc++.h> #include "incursion.h" using namespace std; vector<int> adj[45005]; int n; int sz[45005],par[45005]; bool cmp(int a, int b){ return sz[a]>sz[b]; } int dfs(int x, int p){ par[x]=p; sz[x]=1; for(int i:adj[x]){ if(i==p) continue; sz[x]+=dfs(i,x); } return sz[x]; } int findcent(int x, int p){ for(int i:adj[x]){ if(i==p) continue; if(sz[i]*2>n) return findcent(i,x); } return x; } vector<int> mark(vector<pair<int,int> > ed, int ans){ n=ed.size()+1; vector<int> ret(n,1); for(int i=0; i<=n; i++){ adj[i].clear(); par[i]=-1; } for(pair<int,int> i:ed){ adj[i.first].push_back(i.second); adj[i.second].push_back(i.first); } dfs(ans,-1); int cent=findcent(ans,-1); while(cent!=-1){ ret[cent-1]=0; cent=par[cent]; } return ret; } void follow(int cur){ sort(adj[cur].begin(),adj[cur].end(),cmp); for(int i:adj[cur]){ if(i==par[cur]) continue; int tst=visit(i); if(tst) visit(cur); else{ follow(i); return; } } return; } void locate(vector<pair<int,int> > ed, int cur, int t){ n=ed.size()+1; vector<int> ret(n,1); for(int i=0; i<=n; i++){ adj[i].clear(); par[i]=-1; } for(pair<int,int> i:ed){ adj[i.first].push_back(i.second); adj[i.second].push_back(i.first); } dfs(cur,-1); int cent=findcent(cur,-1); dfs(cent,-1); while(t==1){ if(cur==cent){ int legit=-1; for(int i:adj[cent]){ if(sz[i]*2==n) legit=i; } assert(legit!=-1); cent=legit; dfs(cent,-1); } t=visit(par[cur]); cur=par[cur]; } follow(cur); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...