Advertisement
GerONSo

lca(binups) + crascal(dsu)

Sep 25th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.26 KB | None | 0 0
  1. /*
  2.  
  3. ∧_∧
  4. ( ・ω・。)つ━☆・*。
  5. ⊂  ノ    ・゜
  6. しーJ   Accepted
  7.  
  8. */
  9.  
  10. // #pragma GCC optimize("O3")
  11. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  12.  
  13. #include<bits/stdc++.h>
  14. #include <ext/pb_ds/assoc_container.hpp>
  15. #include <ext/pb_ds/tree_policy.hpp>
  16.  
  17. #define ll long long
  18. #define all(x) begin(x), end(x)
  19. #define x first
  20. #define y second
  21. #define int unsigned int
  22.  
  23. using namespace std;
  24. using namespace __gnu_pbds;
  25.  
  26. typedef pair<int, int> pii;
  27. typedef long double ld;
  28. template<typename T>
  29. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  30.  
  31. const ld PI = atan2(0, -1);
  32.  
  33. void seriy() {
  34. // ios::sync_with_stdio(0);
  35. cin.tie(0);
  36. cout.tie(0);
  37. cout << fixed << setprecision(14);
  38. #ifdef _offline
  39. freopen("input.txt", "r", stdin);
  40. freopen("output.txt", "w", stdout);
  41. #endif
  42. }
  43.  
  44. const int MAXN = 1e5 + 10;
  45. const int MAXM = 600;
  46. const int INF = INT_MAX;
  47. const int MOD = 1e9 + 7;
  48. const int MAXLOG = 31;
  49.  
  50. struct edge {
  51. int u, v, w;
  52. };
  53.  
  54. vector<vector<pair<int, int>>> g, g2;
  55. vector<edge> edges;
  56. vector<int> par, sz, p1, p2, w1, w2, d1, d2;
  57. int up1[MAXLOG][MAXN], up2[MAXLOG][MAXN], kek1[MAXLOG][MAXN], kek2[MAXLOG][MAXN];
  58. int n, m;
  59.  
  60. int get(int a) {
  61. if(par[a] == a) {
  62. return a;
  63. }
  64. return par[a] = get(par[par[a]]);
  65. }
  66.  
  67. void unite(int a, int b) {
  68. a = get(a);
  69. b = get(b);
  70. if(a != b) {
  71. if(sz[a] < sz[b]) {
  72. swap(a, b);
  73. }
  74. par[b] = a;
  75. sz[a] += sz[b];
  76. }
  77. }
  78.  
  79. void dfs(int u, int p) {
  80. for(auto v : g[u]) {
  81. if(v.x != p) {
  82. d1[v.x] = d1[u] + 1;
  83. p1[v.x] = u;
  84. w1[v.x] = v.y;
  85. dfs(v.x, u);
  86. }
  87. }
  88. }
  89.  
  90. void dfs2(int u, int p) {
  91. for(auto v : g2[u]) {
  92. if(v.x != p) {
  93. d2[v.x] = d2[u] + 1;
  94. p2[v.x] = u;
  95. w2[v.x] = v.y;
  96. dfs2(v.x, u);
  97. }
  98. }
  99. }
  100.  
  101. void build() {
  102. for(int i = 0; i < n; i++) {
  103. up1[0][i] = w1[i];
  104. kek1[0][i] = p1[i];
  105. up2[0][i] = w2[i];
  106. kek2[0][i] = p2[i];
  107. }
  108. for(int i = 1; i < MAXLOG; i++) {
  109. for(int j = 0; j < n; j++) {
  110. kek1[i][j] = kek1[i - 1][kek1[i - 1][j]];
  111. kek2[i][j] = kek2[i - 1][kek2[i - 1][j]];
  112. up1[i][j] = min(up1[i - 1][kek1[i - 1][j]], up1[i - 1][j]);
  113. up2[i][j] = min(up2[i - 1][kek2[i - 1][j]], up2[i - 1][j]);
  114. }
  115. }
  116. }
  117.  
  118. pair<int, int> lca1(int a, int b) {
  119. if(d1[a] > d1[b]) {
  120. swap(a, b);
  121. }
  122. int lw = INF;
  123. for(int i = MAXLOG - 1; i >= 0; i--) {
  124. int to = kek1[i][b];
  125. if(d1[to] >= d1[a]) {
  126. lw = min(lw, up1[i][b]);
  127. b = kek1[i][b];
  128. }
  129. }
  130. if(a == b) {
  131. return {a, lw};
  132. }
  133. for(int i = MAXLOG - 1; i >= 0; i--) {
  134. int to1 = kek1[i][a];
  135. int to2 = kek1[i][b];
  136. if(to1 != to2) {
  137. a = kek1[i][a];
  138. b = kek1[i][b];
  139. lw = min(lw, up1[i][a]);
  140. lw = min(lw, up1[i][b]);
  141. }
  142. }
  143. return {p1[a], min(min(lw, w1[a]), w1[b])};
  144. }
  145.  
  146. pair<int, int> lca2(int a, int b) {
  147. if(d2[a] > d2[b]) {
  148. swap(a, b);
  149. }
  150. int lw = INF;
  151. for(int i = MAXLOG - 1; i >= 0; i--) {
  152. int to = kek2[i][b];
  153. if(d2[to] >= d2[a]) {
  154. lw = min(lw, up2[i][b]);
  155. b = kek2[i][b];
  156. }
  157. }
  158. if(a == b) {
  159. return {a, lw};
  160. }
  161. for(int i = MAXLOG - 1; i >= 0; i--) {
  162. int to1 = kek2[i][a];
  163. int to2 = kek2[i][b];
  164. if(to1 != to2) {
  165. a = kek2[i][a];
  166. b = kek2[i][b];
  167. lw = min(lw, up2[i][a]);
  168. lw = min(lw, up2[i][b]);
  169. }
  170. }
  171. return {p2[a], min(min(lw, w2[a]), w2[b])};
  172. }
  173.  
  174. signed main() {
  175. seriy();
  176. cin >> n >> m;
  177. p1.resize(n);
  178. p2.resize(n);
  179. d1.resize(n);
  180. d2.resize(n);
  181. g.resize(n);
  182. w1.resize(n, -1);
  183. w2.resize(n, -1);
  184. g2.resize(n);
  185. sz.resize(n, 1);
  186. par.resize(n);
  187. for(int i = 0; i < n; i++) {
  188. par[i] = i;
  189. }
  190. for(int i = 0; i < m; i++) {
  191. int u, v, t, w;
  192. cin >> t >> u >> v >> w;
  193. u--;
  194. v--;
  195. if(t == 1){
  196. g[u].push_back({v, w});
  197. g[v].push_back({u, w});
  198. }
  199. edges.push_back({u, v, w});
  200. }
  201. sort(all(edges), [&](edge a, edge b) {
  202. return a.w > b.w;
  203. });
  204. for(auto edge : edges) {
  205. int u = edge.u;
  206. int v = edge.v;
  207. if(get(u) != get(v)) {
  208. g2[u].push_back({v, edge.w});
  209. g2[v].push_back({u, edge.w});
  210. unite(u, v);
  211. }
  212. }
  213. dfs(0, -1);
  214. dfs2(0, -1);
  215. build();
  216. vector<int> ans;
  217. vector<int> keks(n);
  218. for(int j = 0; j < MAXLOG; j++) {
  219. for(int i = 0; i < n; i++) {
  220. if(p1[i] != p2[i]) {
  221. keks[i] |= 1;
  222. }
  223. }
  224. }
  225. for(int i = 0; i < n; i++) {
  226. if(!keks[i]) {
  227. ans.push_back(i + 1);
  228. }
  229. }
  230. cout << ans.size() << '\n';
  231. for(auto i : ans) {
  232. cout << i << " ";
  233. }
  234. return 0;
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement