結果
問題 | No.1817 Reversed Edges |
ユーザー | ytft |
提出日時 | 2022-02-13 21:07:35 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 591 ms / 2,000 ms |
コード長 | 2,309 bytes |
コンパイル時間 | 3,105 ms |
コンパイル使用メモリ | 274,616 KB |
実行使用メモリ | 32,256 KB |
最終ジャッジ日時 | 2024-06-29 05:47:23 |
合計ジャッジ時間 | 13,569 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 1 ms
6,940 KB |
testcase_07 | AC | 506 ms
28,416 KB |
testcase_08 | AC | 201 ms
15,616 KB |
testcase_09 | AC | 457 ms
26,880 KB |
testcase_10 | AC | 228 ms
17,152 KB |
testcase_11 | AC | 305 ms
20,952 KB |
testcase_12 | AC | 591 ms
31,744 KB |
testcase_13 | AC | 580 ms
31,872 KB |
testcase_14 | AC | 583 ms
31,744 KB |
testcase_15 | AC | 539 ms
31,744 KB |
testcase_16 | AC | 562 ms
31,744 KB |
testcase_17 | AC | 554 ms
31,744 KB |
testcase_18 | AC | 548 ms
31,872 KB |
testcase_19 | AC | 546 ms
31,744 KB |
testcase_20 | AC | 581 ms
31,744 KB |
testcase_21 | AC | 590 ms
31,744 KB |
testcase_22 | AC | 347 ms
32,128 KB |
testcase_23 | AC | 363 ms
32,256 KB |
testcase_24 | AC | 354 ms
31,616 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; struct tree{ vector<int> parent; int numberOfNodes=0; int root; tree(int N,vector<int>& a,int k=0){ parent=a; numberOfNodes=N; root=k; } tree(int N,set<vector<int>>& edges,int k=0){ root=k; numberOfNodes=N; parent.resize(N); fill(parent.begin(),parent.end(),-1); map<int,set<int>> connected; for(vector<int> v:edges){ connected[v[0]].insert(v[1]); connected[v[1]].insert(v[0]); } queue<int> q; q.push(k); while(!q.empty()){ for(int i:connected[q.front()]){ if(i!=k&&parent[i]==-1){ parent[i]=q.front(); q.push(i); } } q.pop(); } } map<int,vector<int>> getChildren(){ map<int,vector<int>> ret; for(int i=0;i<numberOfNodes;++i){ if(i!=root){ ret[parent[i]].emplace_back(i); } } return ret; } vector<int> bfs(){ vector<int> order(1,root); map<int,vector<int>> children=getChildren(); for(int i=0;i<numberOfNodes;++i){ for(int j:children[order[i]]){ order.emplace_back(j); } } return order; } vector<int> getDepth(){ vector<int> depth(numberOfNodes); vector<int> order=bfs(); depth[root]=0; for(int i=1;i<numberOfNodes;++i){ depth[order[i]]=depth[parent[order[i]]]+1; } return depth; } }; int main(){ int N; cin>>N; set<vector<int>> edges; for(int i=0;i<N-1;++i){ vector<int> temp(2); for(int j=0;j<2;++j){ cin>>temp[j]; --temp[j]; } edges.insert(temp); } tree T(N,edges,0); vector<int> d=T.getDepth(),ans(N,0),ord=T.bfs(); for(vector<int> v:edges){ if(d[max(v[0],v[1])]<d[min(v[0],v[1])]){ ++ans[0]; --ans[min(v[0],v[1])]; }else{ ++ans[max(v[0],v[1])]; } } for(int i:ord){ if(i){ ans[i]+=ans[T.parent[i]]; } } for(int i=0;i<N;++i){ cout<<ans[i]<<endl; } }