結果
問題 | No.1752 Up-Down Tree |
ユーザー | Hanghang |
提出日時 | 2024-06-04 15:41:24 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,764 bytes |
コンパイル時間 | 3,277 ms |
コンパイル使用メモリ | 176,156 KB |
実行使用メモリ | 28,288 KB |
最終ジャッジ日時 | 2024-06-04 15:41:31 |
合計ジャッジ時間 | 5,488 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 93 ms
28,288 KB |
testcase_01 | AC | 67 ms
28,160 KB |
testcase_02 | AC | 65 ms
23,584 KB |
testcase_03 | AC | 70 ms
23,588 KB |
testcase_04 | AC | 69 ms
25,916 KB |
testcase_05 | AC | 98 ms
26,752 KB |
testcase_06 | AC | 72 ms
25,012 KB |
testcase_07 | AC | 71 ms
25,012 KB |
testcase_08 | AC | 31 ms
14,464 KB |
testcase_09 | AC | 91 ms
27,068 KB |
testcase_10 | RE | - |
testcase_11 | AC | 9 ms
10,624 KB |
testcase_12 | AC | 5 ms
10,496 KB |
testcase_13 | AC | 36 ms
16,512 KB |
testcase_14 | AC | 46 ms
17,600 KB |
testcase_15 | AC | 13 ms
12,032 KB |
testcase_16 | AC | 41 ms
17,344 KB |
testcase_17 | AC | 35 ms
16,060 KB |
testcase_18 | AC | 97 ms
24,252 KB |
testcase_19 | AC | 85 ms
24,064 KB |
testcase_20 | AC | 7 ms
10,624 KB |
testcase_21 | AC | 6 ms
10,752 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; }