結果
問題 | No.1752 Up-Down Tree |
ユーザー | Hanghang |
提出日時 | 2024-06-04 15:41:24 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,764 bytes |
コンパイル時間 | 2,082 ms |
コンパイル使用メモリ | 178,064 KB |
実行使用メモリ | 28,288 KB |
最終ジャッジ日時 | 2024-12-23 10:56:14 |
合計ジャッジ時間 | 4,236 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 62 ms
28,160 KB |
testcase_01 | AC | 62 ms
28,288 KB |
testcase_02 | AC | 50 ms
23,632 KB |
testcase_03 | AC | 50 ms
23,628 KB |
testcase_04 | AC | 60 ms
25,796 KB |
testcase_05 | AC | 60 ms
26,752 KB |
testcase_06 | AC | 63 ms
25,140 KB |
testcase_07 | AC | 57 ms
25,136 KB |
testcase_08 | AC | 25 ms
14,336 KB |
testcase_09 | AC | 68 ms
26,944 KB |
testcase_10 | RE | - |
testcase_11 | AC | 5 ms
10,624 KB |
testcase_12 | AC | 4 ms
10,624 KB |
testcase_13 | AC | 34 ms
16,512 KB |
testcase_14 | AC | 40 ms
17,600 KB |
testcase_15 | AC | 11 ms
12,032 KB |
testcase_16 | AC | 35 ms
17,408 KB |
testcase_17 | AC | 30 ms
16,000 KB |
testcase_18 | AC | 78 ms
24,128 KB |
testcase_19 | AC | 75 ms
24,192 KB |
testcase_20 | AC | 4 ms
10,496 KB |
testcase_21 | AC | 5 ms
10,624 KB |
ソースコード
# include <bits/stdc++.h> # define fir first # define sec second # define mp std::make_pair const int N=100010,INF=0x3f3f3f3f; inline int read(void){ int res,f=1; char c; while((c=getchar())<'0'||c>'9') if(c=='-') f=-1; res=c-48; while((c=getchar())>='0'&&c<='9') res=res*10+c-48; return res*f; } int n; int f[N]; std::vector <int> G[N]; void init(int x,int fa){ f[x]=fa; for(auto y:G[x]) if(y!=fa) init(y,x); return; } std::multiset <std::pair <int,int> > S[N]; int ans; // int fmax[N]; // do not consider last step up. void solve(int x){ if(f[x]&&G[x].size()==1){ S[x].insert(mp(1,0)); return; } int id=0; for(auto y:G[x]){ if(y==f[x]) continue; solve(y); if(S[id].size()<S[y].size()) id=y; // for(auto v:S[y]) S[x].insert(v); } S[x].swap(S[id]); for(auto y:G[x]){ if(y==f[x]||y==id) continue; for(auto v:S[y]) S[x].insert(v); } ans=std::max(ans,(*S[x].rbegin()).fir+(*S[x].rbegin()).sec); if(S[x].size()!=1){ auto it=S[x].end(); auto u=--it; auto v=--it; int w=(*u).fir+(*v).fir,k=(*u).sec|(*v).sec; // printf("u = %d %d v = %d %d\n",(*u).fir,(*u).sec,(*v).fir,(*v).sec); if(*v==mp(1,0)&&(*u).sec==1){ if(it==S[x].begin()) k=0; } S[x].erase(u),S[x].erase(v),S[x].insert(mp(w+1,k)); ans=std::max(ans,w+1+k); }else{ auto it=*S[x].begin(); S[x].clear(); S[x].insert(mp(it.fir,1)),ans=std::max(it.fir+1,ans); S[x].insert(mp(1,0)); } // printf("at %d:",x); // for(auto v:S[x]) printf("(%d,%d) ",v.fir,v.sec); // puts(""); return; } int main(void){ // freopen("bird.in","r",stdin); // freopen("bird.out","w",stdout); n=read(); for(int i=2,u,v;i<=n;++i) u=read(),v=read(),G[u].push_back(v),G[v].push_back(u); init(1,0); solve(1); printf("%d",ans); return 0; }