Guest User

b.cpp

a guest
Mar 7th, 2026
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define pb push_back
  4. #define f first
  5. #define s second
  6. #define mp make_pair
  7.  
  8. using namespace std;
  9. const int MAXN = 1e5 + 100;
  10. const int MOD = 1e9 + 7;
  11.  
  12. int dp[MAXN], dpH[MAXN];
  13. vector <int> g[MAXN];
  14. bool removed[MAXN];
  15. ll ans;
  16. map <int, int> allDist;
  17.  
  18. int n, k;
  19.  
  20. int sizeComp(int x, int pr = -1){
  21.     dp[x] = 1;
  22.     for (int i = 0; i < g[x].size(); i++){
  23.         int to = g[x][i];
  24.         if (to == pr)
  25.             continue;
  26.         if (!removed[to]){
  27.             dp[x] += sizeComp(to, x);
  28.         }
  29.     }
  30.  
  31.     return dp[x];
  32. }
  33.  
  34. void findDist(int x, int h = 1, int pr = -1){
  35.     dpH[x] = h;
  36.     ans += allDist[k - dpH[x]];
  37.     for (int i = 0; i < g[x].size(); i++){
  38.         int to = g[x][i];
  39.         if (to == pr)
  40.             continue;
  41.         if (!removed[to]){
  42.             findDist(to, h + 1, x);
  43.         }
  44.     }
  45. }
  46. void addDist(int x, int pr = -1){
  47.     allDist[dpH[x]]++;
  48.     //cout << "x = " << x << ' ' << "dpH[x] = " << dpH[x] << endl;
  49.     for (int i = 0; i < g[x].size(); i++){
  50.         int to = g[x][i];
  51.         if (to == pr)
  52.             continue;
  53.         if (!removed[to]){
  54.             addDist(to, x);
  55.         }
  56.     }
  57. }
  58.  
  59. int findC(int x, int sz, int pr = -1){
  60.  
  61.     for (int i = 0; i < g[x].size(); i++){
  62.         int to = g[x][i];
  63.         if (to == pr)
  64.             continue;
  65.         if (!removed[to] && dp[to] * 2 > sz){
  66.             return findC(to, sz, x);
  67.         }
  68.     }
  69.  
  70.     return x;
  71. }
  72.  
  73. void calc(int c){
  74.  
  75.     //cout << "c = " << c << endl;
  76.     for (int i = 0; i < g[c].size(); i++){
  77.         int to = g[c][i];
  78.         if (!removed[to]){
  79.             findDist(to);
  80.             addDist(to);
  81.         }
  82.     }
  83.  
  84.     ans += allDist[k];
  85. }
  86.  
  87.  
  88.  
  89. void solve(int x, int cnt = 0){
  90.     int sz = sizeComp(x);
  91.     int c = findC(x, sz);
  92.  
  93.     removed[c] = 1;
  94.  
  95.     //ans[c] = cnt;
  96.     allDist.clear();
  97.     calc(c);
  98.     for (int i = 0; i < g[c].size(); i++){
  99.         int to = g[c][i];
  100.         if (!removed[to]){
  101.  
  102.             solve(to, cnt + 1);
  103.         }
  104.     }
  105.  
  106. }
  107. int main(){
  108.     ios::sync_with_stdio(0);
  109.     cin.tie(0);
  110.     cout.tie(0);
  111.  
  112.     cin >> n >> k;
  113.     for (int i = 1; i < n; i++){
  114.         int x, y;
  115.         cin >> x >> y;
  116.         g[x].pb(y);
  117.         g[y].pb(x);
  118.     }
  119.  
  120.     solve(1);
  121.     cout << ans;
  122.  
  123. }
Add Comment
Please, Sign In to add comment