結果
問題 | No.1928 Make a Binary Tree |
ユーザー |
![]() |
提出日時 | 2022-05-06 22:20:21 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,599 bytes |
コンパイル時間 | 4,209 ms |
コンパイル使用メモリ | 234,448 KB |
実行使用メモリ | 64,984 KB |
最終ジャッジ日時 | 2024-07-05 23:37:50 |
合計ジャッジ時間 | 12,683 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 32 WA * 25 |
ソースコード
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll=long long; using Graph=vector<vector<int>>; #define INF 1000000000 #define MOD 998244353 #define MAX 300000 int ans=0; priority_queue<int>* dfs(Graph &G,int v,int p,vector<int> &sz){ priority_queue<int>* pq = new priority_queue<int>(); vector<priority_queue<int>*> pqs; for(int nv:G[v]){ if(nv==p){ continue; } pqs.push_back(dfs(G,nv,v,sz)); pq->push(sz[nv]); } if(pq->size()==1){ if(pqs[0]->size()>0){ ans+=pqs[0]->top(); pqs[0]->pop(); } } sz[v]=1; for(int i=0;i<2;i++){ if(pq->empty()){ break; } sz[v]+=pq->top(); pq->pop(); } int best_i=-1; int best_n=pq->size(); for(int i=0;i<pqs.size();i++){ if(pqs[i]->size()>best_n){ best_i=i; best_n=pqs[i]->size(); } } if(best_i==-1){ for(int i=0;i<pqs.size();i++){ while(!pqs[i]->empty()){ pq->push(pqs[i]->top()); pqs[i]->pop(); } } return pq; }else{ for(int i=0;i<pqs.size();i++){ if(i==best_i){ continue; } while(!pqs[i]->empty()){ pqs[best_i]->push(pqs[i]->top()); pqs[i]->pop(); } } while(!pq->empty()){ pqs[best_i]->push(pq->top()); pq->pop(); } return pqs[best_i]; } } int main(){ int N; cin>>N; Graph G(N); for(int i=0;i<N-1;i++){ int x,y; cin>>x>>y; x--;y--; G[x].push_back(y); G[y].push_back(x); } vector<int> sz(N); dfs(G,0,-1,sz); ans+=sz[0]; cout<<ans<<endl; }