結果
問題 | No.1976 Cut then Connect |
ユーザー | suzuken_w |
提出日時 | 2022-06-10 23:48:14 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,649 bytes |
コンパイル時間 | 2,945 ms |
コンパイル使用メモリ | 230,012 KB |
実行使用メモリ | 10,368 KB |
最終ジャッジ日時 | 2024-09-21 07:02:53 |
合計ジャッジ時間 | 4,684 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | AC | 2 ms
5,376 KB |
testcase_25 | AC | 2 ms
5,376 KB |
testcase_26 | AC | 2 ms
5,376 KB |
testcase_27 | WA | - |
testcase_28 | WA | - |
testcase_29 | WA | - |
testcase_30 | AC | 2 ms
5,376 KB |
testcase_31 | WA | - |
testcase_32 | AC | 2 ms
5,376 KB |
ソースコード
#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"; }