結果
問題 | No.1976 Cut then Connect |
ユーザー |
![]() |
提出日時 | 2022-06-10 23:48:14 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,649 bytes |
コンパイル時間 | 2,942 ms |
コンパイル使用メモリ | 228,972 KB |
最終ジャッジ日時 | 2025-01-29 20:26:22 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 5 WA * 26 |
ソースコード
#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; using ll=long long; using P=pair<ll,ll>; template<class T> using V=vector<T>; #define fi first #define se second #define all(v) (v).begin(),(v).end() const ll inf=(1e18); // const ll mod=998244353; const ll mod=1000000007; const vector<int> dy={-1,0,1,0},dx={0,-1,0,1}; struct __INIT{__INIT(){cin.tie(0);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);}} __init; template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; } template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; } template<class T>void debag(const vector<T> &a){cerr<<"debag :";for(auto v:a)cerr<<v<<" ";cerr<<"\n";} template<class T>void print(const vector<T> &a){for(auto v:a)cout<<v<<" ";cout<<"\n";} int main(){ int n; cin>>n; V<V<int>> g(n); for(int i=0;i<n-1;i++){ int a,b; cin>>a>>b; --a;--b; g[a].emplace_back(b); g[b].emplace_back(a); } V<P> res(n);//最長,部分木の直径 auto dfs1=[&](auto &&self,int cur,int par)->P{ P val={0,0}; V<ll> cp; for(int v:g[cur]){ if(v==par)continue; P tmp=self(self,v,cur); cp.emplace_back(tmp.fi); chmax(val.fi,tmp.fi+1); chmax(val.se,tmp.se); } chmax(val.se,val.fi); if((int)cp.size()>=2){ sort(all(cp),greater<ll>()); chmax(val.se,cp[0]+cp[1]+2); } return res[cur]=val; }; dfs1(dfs1,0,-1); ll ans=res[0].se; auto dfs2=[&](auto &&self,int cur,int par,P val)->void{ if(par!=-1){ chmin(ans,(res[cur].se+1)/2+(val.se+1)/2+1); } multiset<ll> tmp,tmp2; for(int v:g[cur]){ if(v==par)continue; tmp.emplace(res[v].fi); tmp2.emplace(res[v].se); } tmp.emplace(val.fi-1); tmp2.emplace(val.se); for(int v:g[cur]){ if(v==par)continue; P nval={0,0}; tmp.erase(tmp.find(res[v].fi)); tmp2.erase(tmp2.find(res[v].se)); if((int)tmp.size()>=2){ auto ite=tmp.end(); ite--;ll v=*ite; ite--;v+=*ite; v+=2; chmax(nval.se,v); } nval.fi=*tmp.rbegin()+2; chmax(nval.se,*tmp2.rbegin()); chmax(nval.se,nval.fi-1); self(self,v,cur,nval); tmp.emplace(res[v].fi); tmp2.emplace(res[v].se); } }; dfs2(dfs2,0,-1,{0,0}); cout<<ans<<"\n"; }