Submission #1185235

#TimeUsernameProblemLanguageResultExecution timeMemory
1185235kl0989eVillage (BOI20_village)C++20
56 / 100
88 ms27208 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define pb push_back #define vi vector<int> #define vl vector<ll> #define pi pair<int, int> #define pl pair<ll,ll> #define all(x) (x).begin(),(x).end() const int maxn=1e5+10; int n; vector<vi> graph(maxn); vi sze(maxn,1); void dfs(int cur, int prev=-1) { for (auto to:graph[cur]) { if (to==prev) { continue; } dfs(to,cur); sze[cur]+=sze[to]; } } vector<vi> dp(maxn,vi(2,1e9)); vi to(maxn,-1); void dfs2(int cur, int prev=-1) { if (graph[cur].size()==1 && cur!=0) { dp[cur][1]=0; return; } int cnt=0; int diff=1e9; for (auto to:graph[cur]) { if (to==prev) { continue; } dfs2(to,cur); cnt+=min(dp[to][0],dp[to][1]+2); if (dp[to][1]+2<=dp[to][0]) { diff=0; } else { diff=min(diff,dp[to][1]+2-dp[to][0]); } } dp[cur][1]=cnt; dp[cur][0]=cnt+diff; } pi dfs3(int ii, int cur, int prev=-1) { vector<pi> out={{cur,cur}}; int t=-1; if (ii==0 && dp[cur][0]!=dp[cur][1]) { for (auto to:graph[cur]) { if (to==prev) { continue; } if (dp[to][1]+2-dp[to][0]==dp[cur][0]-dp[cur][1]) { t=to; break; } } } for (auto to:graph[cur]) { if (to==prev) { continue; } if (to==t || dp[to][1]+2<=dp[to][0]) { out.pb(dfs3(1,to,cur)); } else { dfs3(0,to,cur); } } int prv=out.size()-1; for (int i=0; i<out.size(); i++) { to[out[i].fi]=out[prv].se; prv=i; } return {out[0].fi,to[out[0].fi]}; } vi to2(maxn,0); int dfs4(int cur, int prev=-1) { bool ok=1; for (auto to:graph[cur]) { if (to==prev) { continue; } int temp=dfs4(to,cur); if (temp!=-1) { return temp; } if (sze[to]>n/2) { ok=0; } } if (ok && n-sze[cur]<=n/2) { return cur; } return -1; } vector<vector<pi>> comp; void dfs5(int cur, int prev=-1) { comp.back().pb({cur,cur}); for (auto to:graph[cur]) { if (to==prev) { continue; } dfs5(to,cur); } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; int a,b; for (int i=0; i<n-1; i++) { cin >> a >> b; graph[--a].pb(--b); graph[b].pb(a); } dfs(0); dfs2(0); dfs3(0,0); int cen=dfs4(0); comp.pb({{cen,cen}}); for (auto to:graph[cen]) { comp.pb({}); dfs5(to,cen); } vi ord(comp.size()); iota(all(ord),0); sort(all(ord),[&](int a, int b){return comp[a].size()>comp[b].size();}); int pt1=0,pt2=1; pi temp={-1,-1}; while (pt1<comp.size() && pt2<comp.size()) { while (pt1<comp.size() && comp[ord[pt1]].size()==0) { pt1++; } while (pt2<comp.size() && (comp[ord[pt2]].size()==0 || pt1==pt2)) { pt2++; } if (pt1==comp.size() || pt2==comp.size()) { break; } if (comp[ord[pt1]].size()<comp[ord[pt2]].size()) { swap(pt1,pt2); } while (comp[ord[pt2]].size()) { pi a=comp[ord[pt1]].back(); comp[ord[pt1]].pop_back(); pi b=comp[ord[pt2]].back(); comp[ord[pt2]].pop_back(); to2[a.fi]=b.se; to2[b.fi]=a.se; if (comp[ord[pt2]].size()==0) { temp={b.fi,a.se}; } } } if (pt1<comp.size() && comp[ord[pt1]].size()) { pi a=comp[ord[pt1]].back(); comp[ord[pt1]].pop_back(); to2[a.fi]=temp.se; to2[temp.fi]=a.se; } if (pt2<comp.size() && comp[ord[pt2]].size()) { pi a=comp[ord[pt2]].back(); comp[ord[pt2]].pop_back(); to2[a.fi]=temp.se; to2[temp.fi]=a.se; } ll ans2=0; for (int i=1; i<n; i++) { ans2+=2*min(sze[i],n-sze[i]); } cout << dp[0][0] << ' ' << ans2 << '\n'; for (int i=0; i<n; i++) { cout << to[i]+1 << " \n"[i==n-1]; } for (int i=0; i<n; i++) { cout << to2[i]+1 << " \n"[i==n-1]; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...