제출 #1167493

#제출 시각아이디문제언어결과실행 시간메모리
1167493dragstThe Ties That Guide Us (CEOI23_incursion)C++20
30 / 100
92 ms6804 KiB
#include <bits/stdc++.h> #include "incursion.h" using namespace std; int root, h[50005], p[50005], l[50005], r[50005], sz[50005]; vector<int> adj[50005]; void dfs(int x) { sz[x]=1; for (auto y: adj[x]) { if (y!=p[x] && l[x]==0) { p[y]=x; l[x]=y; h[y]=h[x]+1; dfs(y); sz[x]+=sz[y]; } else if (y!=p[x]) { p[y]=x; r[x]=y; h[y]=h[x]+1; dfs(y); sz[x]+=sz[y]; }; }; } vector<int> mark(vector<pair<int, int>> F, int safe) { int n=1, i; for (auto p: F) { n=max(n, p.first); n=max(n, p.second); adj[p.first].push_back(p.second); adj[p.second].push_back(p.first); }; for (i=1; i<=n; i++) { if (adj[i].size()==2) {root=i; break;}; }; h[root]=1; dfs(root); vector<int> T(n); for (i=0; i<n; i++) {T[i]=0;}; while (h[safe]>=1) {T[safe-1]=1; safe=p[safe];}; return T; } void locate(vector<pair<int, int>> F, int curr, int t) { int n=1, i; for (auto p: F) { n=max(n, p.first); n=max(n, p.second); adj[p.first].push_back(p.second); adj[p.second].push_back(p.first); }; for (i=1; i<=n; i++) { if (adj[i].size()==2) {root=i; break;}; }; h[root]=1; dfs(root); if (t==0) { do {curr=p[curr]; i=visit(curr);} while (i==0); }; if (l[curr]==0) {return;}; do { if (sz[l[curr]]<=sz[r[curr]]) {curr=r[curr];} else {curr=l[curr];}; i=visit(curr); if (i==0) { curr=p[curr]; i=visit(curr); if (sz[l[curr]]<=sz[r[curr]]) {curr=l[curr];} else {curr=r[curr];}; i=visit(curr); }; } while (l[curr]>0 && i==1); if (i==0) {curr=p[curr]; i=visit(curr);}; return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...