Advertisement
Guest User

a

a guest
Nov 18th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.35 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 210000;
  5.  
  6. struct dfs_res {
  7.     int ans;
  8.     int sz;
  9.  
  10.     dfs_res(int _ans, int _sz) :
  11.         ans(_ans), sz(_sz)
  12.     {};
  13. };
  14.  
  15. int n, m;
  16.  
  17. vector<int> g[MAXN];
  18. int level[MAXN];
  19. int parent[MAXN];
  20. int color[MAXN];
  21. int cnt[MAXN][2];
  22. int ans[MAXN][2];
  23. int contrib[MAXN][2];
  24. int dist[300][MAXN];
  25.  
  26. struct centroid_decomposition {
  27.     centroid_decomposition() {
  28.         for (int i = 0; i < n; ++i) {
  29.             level[i] = -1;
  30.             parent[i] = color[i] = 0;
  31.         }
  32.  
  33.         build(0, -1, 0, n);
  34.     }
  35.  
  36.     dfs_res dfs1(int v, int p, int SZ, int& center) {
  37.         int sz = 1, ans = 0;
  38.  
  39.         for (int to : g[v]) {
  40.             if (to != p && level[to] == -1) {
  41.                 auto t = dfs1(to, v, SZ, center);
  42.                 sz += t.sz;
  43.                 ans += (t.ans + t.sz);
  44.             }
  45.         }
  46.  
  47.         if (center == -1 && (2 * sz > SZ || p == -1))
  48.             center = v;
  49.  
  50.         return dfs_res(ans, sz);
  51.     }
  52.  
  53.     dfs_res dfs2(int v, int p, int lvl, int d) {
  54.         dist[lvl][v] = d;
  55.         int sz = 1, ans = 0;
  56.  
  57.         for (int to : g[v]) {
  58.             if (to != p && level[to] == -1) {
  59.                 auto t = dfs2(to, v, lvl, d + 1);
  60.                 sz += t.sz;
  61.                 ans += (t.ans + t.sz);
  62.             }
  63.         }
  64.  
  65.         return dfs_res(ans, sz);
  66.     }
  67.  
  68.     void build(int v, int p, int lvl, int SZ) {
  69.         int center = -1;
  70.  
  71.         dfs_res ans_sz = dfs1(v, -1, SZ, center);
  72.  
  73.         int t = ans_sz.ans + ans_sz.sz;
  74.  
  75.         ans_sz = dfs2(center, center, lvl, 0);
  76.  
  77.         parent[center] = p;
  78.  
  79.         ans[center][0] = ans_sz.ans;
  80.         ans[center][1] = 0;
  81.  
  82.         cnt[center][0] = ans_sz.sz;
  83.         cnt[center][1] = 0;
  84.  
  85.         contrib[center][0] = t;
  86.         contrib[center][1] = 0;
  87.  
  88.         level[center] = lvl;
  89.  
  90.         for (int to : g[center])
  91.             if (level[to] == -1)
  92.                 build(to, center, lvl + 1, SZ / 2);
  93.     }
  94.  
  95.     void change(int v) {
  96.         int t_v = v;
  97.         int c = color[v];
  98.         int n_c = (c + 1) % 2;
  99.  
  100.         color[v] = n_c;
  101.  
  102.         do {
  103.             --cnt[v][c];
  104.             ++cnt[v][n_c];
  105.  
  106.             if (parent[v] != -1) {
  107.                 contrib[v][c] -= dist[level[parent[v]]][t_v];
  108.                 contrib[v][n_c] += dist[level[parent[v]]][t_v];
  109.                 ans[parent[v]][c] -= dist[level[parent[v]]][t_v];
  110.                 ans[parent[v]][n_c] += dist[level[parent[v]]][t_v];
  111.             }
  112.  
  113.             v = parent[v];
  114.         } while (v != -1);
  115.     }
  116.  
  117.     int get(int v) {
  118.         int t_v = v;
  119.         int c = color[v];
  120.         int res = ans[v][c];
  121.  
  122.         while (parent[v] != -1) {
  123.             res += ans[parent[v]][c] - contrib[v][c] + (cnt[parent[v]][c] - cnt[v][c]) * dist[level[parent[v]]][t_v];
  124.             v = parent[v];
  125.         }
  126.         return res;
  127.     }
  128. };
  129.  
  130. void solve() {
  131.     cin >> n >> m;
  132.  
  133.     for (int i = 0; i < n; ++i)
  134.         g[i] = vector<int>();
  135.  
  136.     for (int i = 0; i < n - 1; ++i) {
  137.         int u, v;
  138.         cin >> u >> v;
  139.         g[u - 1].push_back(v - 1);
  140.         g[v - 1].push_back(u - 1);
  141.     }
  142.  
  143.     centroid_decomposition cd;
  144.  
  145.     for (int i = 0; i < m; ++i) {
  146.         int type, v;
  147.         cin >> type >> v;
  148.         if (type == 1) {
  149.             cd.change(v - 1);
  150.         } else {
  151.             cout << cd.get(v - 1) << "\n";
  152.         }
  153.     }
  154.  
  155. }
  156.  
  157. int main() {
  158.     solve();
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement