제출 #1278161

#제출 시각아이디문제언어결과실행 시간메모리
1278161glupanVillage (BOI20_village)C++20
100 / 100
105 ms27972 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int MAX_N = 100005; vector<ll>adj[MAX_N]; ll visited[MAX_N],ans,ans1; ll order[MAX_N],cnt=1; ll sub[MAX_N],N; void dfs_1(int v, int p){ sub[v] = 1; for(auto u : adj[v]) { if(u == p) continue; dfs_1(u, v); sub[v] += sub[u]; } } int get_centroid(int v, int p) { for(auto u : adj[v]) { if(u == p) continue; if(sub[u] > N/2) return get_centroid(u, v); } return v; } void dfs(int s, int p) { for(int u : adj[s]) { if(u == p) continue; dfs(u,s); } if(!visited[s] and !visited[p] and s and p) { visited[s] = p; visited[p] = s; ans+=2; } } void dfs2(int s, int p) { order[cnt++] = s; for(int u : adj[s]) { if(u == p) continue; dfs2(u,s); } } void solve() { ll n; cin >> n; N=n; for(int i=0; i<n-1; i++) { int a,b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } dfs(1,0); for(int i=1; i<=n; i++) { if(!visited[i]) { visited[i] = i; swap(visited[i], visited[adj[i][0]]); ans+=2; } } dfs_1(1, 1); ll c = get_centroid(1, 1); dfs_1(c, c); for(int i=1; i<=n; i++) { ans1 += 2 * min(sub[i], n - sub[i]); } cout << ans << " " << ans1 << endl; for(int i=1; i<=n; i++) cout << visited[i] << " "; cout << endl; dfs2(1,0); ll Ans[n+1]; for(int i=1; i<=n; i++) { int tmp = (i+n/2)%n; if(tmp == 0) tmp = n; Ans[order[i]] = order[tmp]; } for(int i=1; i<=n; i++) cout << Ans[i] << " "; cout << endl; } int main() { ios::sync_with_stdio(false); cin.tie(NULL); int t=1; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...