Advertisement
Guest User

Untitled

a guest
Jun 17th, 2020
442
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. #include <vector>
  2. #include <set>
  3. #include <map>
  4. #include <queue>
  5. #include <stack>
  6. #include <deque>
  7. #include <bitset>
  8.  
  9. #include <iostream>
  10. #include <algorithm>
  11. #include <cmath>
  12. #include <iterator>
  13. #include <iomanip>
  14. #include <random>
  15. #include <numeric>
  16.  
  17. // #include <bits/stdc++.h>
  18. // #include <ext/pb_ds/tree_policy.hpp>
  19. // #include <ext/pb_ds/assoc_container.hpp>
  20.  
  21. using namespace std;
  22. // using namespace __gnu_pbds;
  23.  
  24. typedef long long ll;
  25. typedef long double ld;
  26. typedef pair<int, int> pi;
  27. typedef pair<ll,ll> pl;
  28. typedef pair<double,double> pd;
  29. typedef priority_queue<int, vector<int>, greater<int> > min_heap;
  30.  
  31. // template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
  32.  
  33. #define mp make_pair
  34. #define pb push_back
  35. #define f first
  36. #define s second
  37. #define lb lower_bound
  38. #define ub upper_bound
  39. #define all(x) x.begin(), x.end()
  40.  
  41. const double PI = 4*atan(1);
  42. const ll INF = 1e18;
  43. const int MX = 100001;
  44.  
  45. const int maxn = 2e5 + 5;
  46. int parent[maxn], depth[maxn], heavy[maxn], head[maxn], pos[maxn];
  47. int cur_pos = 1;
  48. vector<int> adj[maxn];
  49. int bit[maxn];
  50.  
  51. int bit_query(int pos) {
  52. int res = 0;
  53. for (int i = pos; i > 0; i -= i & -i) {
  54. res += bit[i];
  55. }
  56. return res;
  57. }
  58.  
  59. void bit_update(int pos, int delta) {
  60. for (int i = pos; i < maxn; i += i & -i) {
  61. bit[i] += delta;
  62. }
  63. }
  64.  
  65. int dfs(int u) {
  66. int size = 1;
  67. int max_v_size = 0;
  68. for (int v: adj[u]) {
  69. if (v != parent[u]) {
  70. parent[v] = u;
  71. depth[v] = depth[u] + 1;
  72. int v_size = dfs(v);
  73. size += v_size;
  74. if (v_size > max_v_size) {
  75. max_v_size = v_size;
  76. heavy[u] = v;
  77. }
  78. }
  79. }
  80. return size;
  81. }
  82.  
  83. void decompose(int u, int h) {
  84. head[u] = h;
  85. pos[u] = cur_pos++;
  86. if (heavy[u] != -1) {
  87. decompose(heavy[u], h);
  88. }
  89. for (int v: adj[u]) {
  90. if (v != parent[u] and v != heavy[u]) {
  91. decompose(v, v);
  92. }
  93. }
  94. }
  95.  
  96.  
  97. void update(int u, int v, int delta) {
  98. int res = 0;
  99. for (; head[u] != head[v]; v = parent[head[v]]) {
  100. if (depth[head[u]] > depth[head[v]]) swap(u, v);
  101. bit_update(pos[head[v]], +delta);
  102. bit_update(pos[v] + 1, -delta);
  103. }
  104. if (depth[u] > depth[v]) swap(u, v);
  105. bit_update(pos[u], +delta);
  106. bit_update(pos[v] + 1, -delta);
  107. }
  108.  
  109. int n, k;
  110.  
  111.  
  112.  
  113. int main() {
  114. ios::sync_with_stdio(0);
  115. cin.tie(0);
  116. freopen("maxflow.in", "r", stdin);
  117. freopen("maxflow.out", "w", stdout);
  118. cin >> n >> k;
  119. for (int i = 1; i < n; i++) {
  120. int u, v;
  121. cin >> u >> v;
  122. adj[u].pb(v);
  123. adj[v].pb(u);
  124. }
  125. for (int i = 1; i <= n; i++) {
  126. heavy[i] = -1;
  127. }
  128. dfs(1);
  129. decompose(1, 1);
  130. for (int i = 1; i <= k; i++) {
  131. int u, v;
  132. cin >> u >> v;
  133. update(u, v, +1);
  134. }
  135. int ans = 0;
  136. for (int i = 1; i<= cur_pos; i++) {
  137. ans = max(ans, bit_query(i));
  138. }
  139. cout << ans << "\n";
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement