結果
| 問題 |
No.1976 Cut then Connect
|
| コンテスト | |
| ユーザー |
suzuken_w
|
| 提出日時 | 2022-06-11 19:52:49 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 116 ms / 2,000 ms |
| コード長 | 2,673 bytes |
| コンパイル時間 | 2,834 ms |
| コンパイル使用メモリ | 228,324 KB |
| 最終ジャッジ日時 | 2025-01-29 20:38:48 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 31 |
ソースコード
#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,max({(res[cur].se+1)/2+(val.se+1)/2+1,val.se,res[cur].se}));
}
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);
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()+1;
chmax(nval.se,*tmp2.rbegin());
chmax(nval.se,nval.fi);
self(self,v,cur,nval);
tmp.emplace(res[v].fi);
tmp2.emplace(res[v].se);
}
};
dfs2(dfs2,0,-1,{-1,0});
cout<<ans<<"\n";
}
suzuken_w