제출 #419978

#제출 시각아이디문제언어결과실행 시간메모리
419978nafis_shifatMeetings 2 (JOI21_meetings2)C++14
100 / 100
439 ms44516 KiB
#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> using namespace std; const int mxn=2e5+5; const int inf=1e9; vector<int> adj[mxn]; int sz[mxn]; int parent[20][mxn]; int level[mxn] = {}; int n; vector<int> con[mxn]; void dfs(int cur,int prev) { parent[0][cur] = prev; level[cur] = level[prev] + 1; sz[cur] = 1; for(int u : adj[cur]) { if(u == prev) continue; dfs(u,cur); sz[cur] += sz[u]; } con[sz[cur]].push_back(cur); } int getCentroid(int cur,int prev) { bool f = (n - sz[cur]) <= n / 2; for(int u : adj[cur]) { if(u == prev) continue; f = f && (sz[u] <= (n / 2)); } if(f) return cur; for(int u : adj[cur]) { if(u == prev) continue; if(sz[u] > (n / 2)) return getCentroid(u,cur); } return -1; } int getLCA(int u,int v) { if(level[u] < level[v]) swap(u,v); int dif = level[u] - level[v]; for(int i = 0; i < 20; i++) { if((dif >> i) & 1) u = parent[i][u]; } if(u == v) return u; for(int i = 19; i >= 0; i--) { if(parent[i][u] != parent[i][v]) { u = parent[i][u]; v = parent[i][v]; } } return parent[0][u]; } int dist(int u,int v) { return level[u] + level[v] - 2 * level[getLCA(u,v)]; } int main() { cin >> n; for(int i = 1; i < n; i++) { int u,v; scanf("%d%d",&u,&v); adj[u].push_back(v); adj[v].push_back(u); } dfs(1,0); int root = getCentroid(1,0); for(int i = 0; i <= n; i++) con[i].clear(); dfs(root,0); for(int i = 1; i < 20; i++) { for(int j = 1; j <= n; j++) { parent[i][j] = parent[i - 1][parent[i - 1][j]]; } } int U = root , V = root; int res[n + 1]; for(int i = n; i >= 1; i--) { int ans = dist(U,V); if(i % 2 == 1) { res[i] = 0; continue; } int x = i/2; for(int cur : con[x]) { int d1 = dist(U,V); int d2 = dist(U,cur); int d3 = dist(V,cur); if(d2 >= max(d1,d3)) { V = cur; } else if(d3 >= max(d1,d2)) { U = cur; } if(level[U] < level[V]) swap(U,V); ans = max(ans,max({d1,d2,d3})); } res[i] = ans; } for(int i = 1; i <= n; i++) printf("%d\n",res[i] + 1); }

컴파일 시 표준 에러 (stderr) 메시지

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