Submission #1199516

#TimeUsernameProblemLanguageResultExecution timeMemory
1199516byunjaewooThe Ties That Guide Us (CEOI23_incursion)C++20
100 / 100
157 ms10616 KiB
#include <bits/stdc++.h> using namespace std; #include "incursion.h" vector<int> mark(vector<pair<int, int>> F, int safe) { int n=F.size()+1; vector<vector<int>> adj(n); for(int i=0; i<n-1; i++) adj[F[i].first-1].push_back(F[i].second-1), adj[F[i].second-1].push_back(F[i].first-1); vector<int> siz(n, 0), par(n); function<void(int, int)> dfs=[&](int curr, int prev) { siz[curr]=1; for(int next:adj[curr]) if(next!=prev) par[next]=curr, dfs(next, curr), siz[curr]+=siz[next]; }; dfs(0, -1); int cent1=-1, cent2=-1; for(int i=0; i<n; i++) { bool flag=true; for(int next:adj[i]) if(siz[next]<siz[i] && siz[next]>n/2) flag=false; if(flag && n-siz[i]<=n/2) { if(cent1<0) cent1=i; else cent2=i; } } vector<int> ret(n, 1); dfs(cent1, -1), par[cent1]=-1; if(cent2>=0) par[cent2]=-1; for(int i=safe-1; i>=0; i=par[i]) ret[i]=0; return ret; } void locate(vector<pair<int, int>> F, int curr, int t) { int n=F.size()+1; vector<vector<int>> adj(n); for(int i=0; i<n-1; i++) adj[F[i].first-1].push_back(F[i].second-1), adj[F[i].second-1].push_back(F[i].first-1); vector<int> siz(n, 0), par(n); function<void(int, int)> dfs=[&](int curr, int prev) { siz[curr]=1; for(int next:adj[curr]) if(next!=prev) par[next]=curr, dfs(next, curr), siz[curr]+=siz[next]; }; dfs(0, -1); int cent1=-1, cent2=-1; for(int i=0; i<n; i++) { bool flag=true; for(int next:adj[i]) if(siz[next]<siz[i] && siz[next]>n/2) flag=false; if(flag && n-siz[i]<=n/2) { if(cent1<0) cent1=i; else cent2=i; } } dfs(cent1, -1), par[cent1]=cent2; if(cent2>=0) siz[cent1]-=siz[cent2]; vector<vector<int>> chd(n); for(int i=0; i<n; i++) { for(int j:adj[i]) if(j!=par[i]) chd[i].push_back(j); sort(chd[i].begin(), chd[i].end(), [&](int a, int b) {return siz[a]>siz[b];}); } int prev=-1; curr--; while(true) { if(t) { t=visit(par[curr]+1), prev=curr, curr=par[curr]; } else { bool flag=false; for(int next:chd[curr]) if(next!=prev) { t=visit(next+1); if(!t) { flag=true, prev=curr, curr=next; break; } else visit(curr+1); } if(!flag) break; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...