Submission #857983

#TimeUsernameProblemLanguageResultExecution timeMemory
857983Trisanu_DasVillage (BOI20_village)C++17
100 / 100
86 ms22864 KiB
//AE86!!!! #include<bits/stdc++.h> using namespace std; #define ll long long #define N 100005 int n,u,v,cnt=1,h1[N],h2[N],sz[N],seq[N],lv[N],P[20][N]; ll ans1,ans2; vector<int> adj[N]; void A1(int u,int p){ for(auto v : adj[u]){ if(v == p) continue; A1(v,u); } if(h1[u] == u){ if(u == 1) swap(h1[u],h1[adj[1][0]]); else swap(h1[u],h1[p]); ans1 += 2; } } int size(int u,int p){ sz[u] = 1; for(auto v : adj[u]) if(v != p) sz[u] += size(v,u); return sz[u]; } int find_cen(int u,int p,int all){ for(auto v : adj[u]) if(v != p && sz[v] > n/2) return find_cen(v,u,all); return u; } void dfs(int u,int p,int l){ seq[cnt++] = u; lv[u] = l; P[0][u] = p; for(int i=1;i<=18;i++) P[i][u] = P[i-1][P[i-1][u]]; for(auto v : adj[u]) if(v != p) dfs(v,u,l+1); } long long dis(int u,int v){ if(lv[u] < lv[v]) swap(u,v); long long diff = lv[u] - lv[v], dist = 0; for(int i=18;i>=0;i--) if((1<<i) & diff) dist += (1<<i), u = P[i][u]; if(u == v) return dist; for(int i=18;i>=0;i--) if(P[i][u] != P[i][v]) u = P[i][u], v = P[i][v], dist += 2*(1<<i); return dist + 2; } void A2(int u){ size(1,1); int c = find_cen(1,1,n); dfs(c,c,1); for(int i=1;i<=n;i++) h2[seq[i]] = seq[(i+n/2-1)%n+1], ans2 += dis(seq[i],h2[seq[i]]); } int main(){ scanf("%d",&n); for(int i=1;i<n;i++){ scanf("%d%d",&u,&v); adj[u].push_back(v), adj[v].push_back(u); } for(int i=1;i<=n;i++) h1[i] = i; A1(1,1); A2(1); printf("%lld %lld\n",ans1,ans2); for(int i=1;i<=n;i++) printf("%d ",h1[i]); printf("\n"); for(int i=1;i<=n;i++) printf("%d ",h2[i]); }

Compilation message (stderr)

Village.cpp: In function 'int main()':
Village.cpp:58:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |  scanf("%d",&n);
      |  ~~~~~^~~~~~~~~
Village.cpp:60:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |   scanf("%d%d",&u,&v);
      |   ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...