結果
問題 |
No.768 Tapris and Noel play the game on Treeone
|
ユーザー |
![]() |
提出日時 | 2018-12-15 14:36:24 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 130 ms / 2,000 ms |
コード長 | 1,332 bytes |
コンパイル時間 | 1,041 ms |
コンパイル使用メモリ | 113,544 KB |
実行使用メモリ | 28,256 KB |
最終ジャッジ日時 | 2024-09-25 06:37:29 |
合計ジャッジ時間 | 4,166 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 |
ソースコード
// includes {{{ #include<iostream> #include<iomanip> #include<algorithm> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<tuple> #include<cmath> #include<random> #include<cassert> // #include<deque> // #include<multiset> // #include<bitset> // #include<cstring> // #include<bits/stdc++.h> // }}} using namespace std; using ll = long long; const int N = 1e5; vector< vector< int > > g(N); using Value = int; map< int, Value > dp[N]; // dp[i][j] := jを親としたときの, 部分木iがwinning何本と繋がっているか Value dfs(int i, int p, int f) { if(dp[i].count(p)) return dp[i][p]; int deg = g[i].size() - (p != -1); Value res = 0; if(f || p == -1) { // O(deg) // go only child for(int j : g[i]) if(j != p) { res += !dfs(j, i, f); } } else { // O(1) res = dfs(i, -1, f) - (!dfs(p, i, f)); } return dp[i][p] = res; } int n; int main() { std::ios::sync_with_stdio(false), std::cin.tie(0); cin >> 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); } dfs(0, -1, 1); vector<int> v; for(int i = 0; i < n; i++) if(!dfs(i, -1, 0)) v.emplace_back(i); cout << v.size() << "\n"; for(int e : v) cout << e + 1 << "\n"; return 0; }