fork download
  1. /*
  2. Lord Jesus, grant me clarity and patience to write clean code.
  3. Buddha, help my mind be calm and mindful so I see the errors before they happen.
  4. Allah, guide my hands on the straight path of logic, free from bugs and confusion.
  5. May every compile be smooth, and every run be successful.
  6. Amen. So be it. Ameen.
  7. */
  8. #include <bits/stdc++.h>
  9. using namespace std;
  10. typedef long long ll;
  11. typedef pair<ll,ll> pll;
  12. typedef pair<ll,pll> lll;
  13. typedef array<ll,3> arr3;
  14. typedef pair<ll,arr3> pq3;
  15. #define fi first
  16. #define se second
  17.  
  18. const ll maxN = 1e5 + 5, maxM = 5e4 + 5, maxLog = 20;
  19.  
  20. ll n, h [maxN], st [maxN], en [maxN], pr [maxN] [maxLog], cnt, t, f [maxN], m, k;
  21. vector <ll> adj [maxN], ver;
  22. stack <ll> sta;
  23. vector <pll> edge;
  24.  
  25. void dfs (ll x, ll par) {
  26. h [x] = h [par] + 1;
  27. pr [x] [0] = par;
  28. for (int i = 1; i < maxLog; i ++) pr [x] [i] = pr [pr [x] [i - 1]] [i - 1];
  29. st [x] = ++ cnt;
  30. for (ll i : adj [x]) if (i != par) dfs (i, x);
  31. en [x] = cnt;
  32. }
  33.  
  34. ll lca (ll x, ll y) {
  35. if (h [x] < h [y]) swap (x, y);
  36. if (h [x] > h [y]) {
  37. ll dis = h [x] - h [y];
  38. for (int i = 0; i < maxLog; i ++) if ((dis >> i) & 1) x = pr [x] [i];
  39. }
  40. if (x == y) return x;
  41. for (int i = maxLog - 1; ~i; i --) {
  42. if (pr [x] [i] != pr [y] [i]) {
  43. x = pr [x] [i];
  44. y = pr [y] [i];
  45. }
  46. }
  47. return pr [x] [0];
  48. }
  49.  
  50. bool cmp (ll x, ll y) {return st [x] < st [y];}
  51.  
  52. void build () {
  53. t = ver. size ();
  54. if (t < 2) {
  55. ver. clear ();
  56. return;
  57. }
  58. sort (ver. begin (), ver. end (), cmp);
  59. for (int i = 1; i < t; i ++) ver. push_back (lca (ver [i], ver [i - 1]));
  60. sort (ver. begin (), ver. end (), cmp);
  61. ver. erase (unique (ver. begin (), ver. end ()), ver. end ());
  62. sta. push (ver [0]);
  63. for (int i = 1; i < ver. size (); i ++) {
  64. f [ver [i]] ++;
  65. //cerr << ver [i] << '+' << '\n';
  66. while (en [sta. top ()] < st [ver [i]]) sta. pop ();
  67. f [pr [sta. top ()] [0]] --;
  68. //cerr << sta. top () << '-' << '\n';
  69. sta. push (ver [i]);
  70. }
  71. while (!sta. empty ()) sta. pop ();
  72. ver. clear ();
  73. }
  74.  
  75. void dfs2 (ll x, ll par) {
  76. for (ll i : adj [x]) if (i != par) {
  77. dfs2 (i, x);
  78. f [x] += f [i];
  79. }
  80. }
  81.  
  82. signed main () {
  83. ios::sync_with_stdio (0);
  84. cin. tie (0);
  85. cout. tie (0);
  86. #define task "untitled1"
  87. if (fopen (task".inp", "r")) {
  88. freopen (task".inp", "r", stdin );
  89. freopen (task".out", "w", stdout);
  90. }
  91. cin >> n >> m >> k;
  92. for (int i = 1, u, v; i < n; i ++) {
  93. cin >> u >> v;
  94. adj [u]. push_back (v);
  95. adj [v]. push_back (u);
  96. edge. push_back ({u, v});
  97. }
  98. dfs (1, 0);
  99. for (int c, x; m; m --) {
  100. cin >> c;
  101. for (;c;c --) {
  102. cin >> x;
  103. ver. push_back (x);
  104. }
  105. //for (ll i : ver) cerr << i << ' '; cerr << '\n';
  106. build ();
  107. //for (int i = 1; i <= n; i ++) cerr << f [i] << ' '; cerr << '\n';
  108. }
  109. dfs2 (1, 0);
  110. //for (int i = 1; i <= n; i ++) cerr << f [i] << ' '; cerr << '\n';
  111. vector <ll> ans;
  112. cnt = 0;
  113. for (pll i : edge) {
  114. cnt ++;
  115. if (f [i. fi] >= k && f [i. se] >= k) ans. push_back (cnt);
  116. }
  117. cout << ans. size () << '\n';
  118. for (ll i : ans) cout << i << ' ';
  119. }
  120.  
Success #stdin #stdout 0.01s 9392KB
stdin
Standard input is empty
stdout
0