Advertisement
Guest User

Bairro

a guest
Dec 7th, 2016
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define MAXN 212345
  5. #define inf 0x3f3f3f3f
  6. typedef pair<int,int> pii;
  7.  
  8. vector<int> graph[MAXN];
  9. int n, k, maxh, num;
  10. int ans[MAXN], sz[MAXN], hsum[MAXN], subtree_hsum[MAXN];
  11. bool block[MAXN];
  12.  
  13. int dfs1(int a, int p)
  14. {
  15.         sz[a] = 1;
  16.         for(int i = 0; i < graph[a].size(); i++)
  17.                 if(graph[a][i] != p && !block[graph[a][i]])
  18.                         sz[a] += dfs1(graph[a][i], a);
  19.         return sz[a];
  20. }
  21.  
  22. void dfs2(int a, int p, pii &res)
  23. {
  24.         int mx = num - sz[a];
  25.         for(int i = 0; i < graph[a].size(); i++)
  26.                 if(graph[a][i] != p && !block[graph[a][i]])
  27.                 {
  28.                         mx = max(mx, sz[graph[a][i]]);
  29.                         dfs2(graph[a][i], a, res);
  30.                 }
  31.         if(mx < res.first)
  32.                 res = pii(mx, a);
  33. }
  34.  
  35. int find_centroid(int a)
  36. {
  37.         num = dfs1(a, a);
  38.         pair<int,int> res(inf, 0);
  39.         dfs2(a, a, res);
  40.         return res.second;
  41. }
  42.  
  43. void dfs3(int a, int p, int h, int vec[])
  44. {
  45.         maxh = max(h, maxh);
  46.         vec[h]++;
  47.         for(int i = 0; i < graph[a].size(); i++)
  48.                 if(graph[a][i] != p && !block[graph[a][i]])
  49.                         dfs3(graph[a][i], a, h+1, vec);
  50. }
  51.  
  52. void dfs4(int a, int p, int h)
  53. {
  54.         if(h > k)
  55.                 return;
  56.         ans[a] += hsum[min(num, k - h)] - subtree_hsum[min(maxh, k - h)];
  57.         for(int i = 0; i < graph[a].size(); i++)
  58.                 if(graph[a][i] != p && !block[graph[a][i]])
  59.                         dfs4(graph[a][i], a, h+1);
  60. }
  61.  
  62. void decomp(int a)
  63. {
  64.         a = find_centroid(a);
  65.         maxh = 0;
  66.         num = dfs1(a, a);
  67.         memset(hsum, 0, sizeof(int) * (num + 1));
  68.         dfs3(a, a, 0, hsum);
  69.         for(int i = 1; i <= num; i++)
  70.                 hsum[i] += hsum[i-1];
  71.         ans[a] += hsum[min(num, k)];
  72.  
  73.         for(int i = 0; i < graph[a].size(); i++)
  74.                 if(!block[graph[a][i]])
  75.                 {
  76.                         memset(subtree_hsum, 0, sizeof(int) * (sz[graph[a][i]] + 1));
  77.                         maxh = 0;
  78.                         dfs3(graph[a][i], a, 1, subtree_hsum);
  79.                         for(int j = 1; j <= maxh; j++)
  80.                                 subtree_hsum[j] += subtree_hsum[j-1];
  81.                         dfs4(graph[a][i], a, 1);
  82.                 }
  83.  
  84.         block[a] = true;
  85.         for(int i = 0; i < graph[a].size(); i++)
  86.                 if(!block[graph[a][i]])
  87.                         decomp(graph[a][i]);
  88. }
  89.  
  90. int main(void)
  91. {
  92.         int a, b;
  93.         scanf("%d %d", &n, &k);
  94.         for(int i = 1; i < n; i++)
  95.         {
  96.                 scanf("%d %d", &a, &b);
  97.                 graph[a].push_back(n+i);
  98.                 graph[n+i].push_back(b);
  99.                 graph[b].push_back(n+i);
  100.                 graph[n+i].push_back(a);
  101.         }
  102.         decomp(1);
  103.         int retv = 0;
  104.         if(k%2 == 0)
  105.                 for(int i = 1; i <= n; i++)
  106.                         retv = max(retv, ans[i]);
  107.         else
  108.                 for(int i = n+1; i < 2*n; i++)
  109.                         retv = max(retv, ans[i]);
  110.         printf("%d\n", (retv + 1) / 2);
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement