Advertisement
BaoJIaoPisu

Untitled

Nov 17th, 2022
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.67 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6. using ld = long double;
  7. using ull = unsigned long long;
  8.  
  9. using pii = pair<int, int>;
  10. using pll = pair<ll, ll>;
  11. using pld = pair<ld, ld>;
  12.  
  13. #define fi first
  14. #define se second
  15. #define pb push_back
  16. #define pf push_front
  17. #define mp make_pair
  18. #define ins insert
  19. #define btpc __builtin_popcount
  20. #define btclz __builtin_clz
  21.  
  22. #define sz(x) (int)(x.size());
  23. #define all(x) x.begin(), x.end()
  24. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  25.  
  26. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  27.  
  28. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  29. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  30. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  31.  
  32. template<class X, class Y>
  33.     bool minimize(X &x, const Y &y) {
  34.         if (x > y)
  35.         {
  36.             x = y;
  37.             return true;
  38.         }
  39.         return false;
  40.     }
  41. template<class X, class Y>
  42.     bool maximize(X &x, const Y &y) {
  43.         if (x < y)
  44.         {
  45.             x = y;
  46.             return true;
  47.         }
  48.         return false;
  49.     }
  50.  
  51. const int MOD = 1e9 + 7; //998244353
  52.  
  53. template<class X, class Y>
  54.     void add(X &x, const Y &y) {
  55.         x = (x + y);
  56.         if(x >= MOD) x -= MOD;
  57.     }
  58.  
  59. template<class X, class Y>
  60.     void sub(X &x, const Y &y) {
  61.         x = (x - y);
  62.         if(x < 0) x += MOD;
  63.     }
  64.  
  65. /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
  66.  
  67. const ll INF = 1e9;
  68. const int N = 4e5 + 10;
  69. const int LOG = 18;
  70.  
  71. template <class T> struct FenwickTree {
  72.     int n;
  73.     vector<T> bit;
  74.  
  75.     FenwickTree(int _n = 0) {
  76.         n = _n;
  77.         bit.resize(n + 5);
  78.         for(int i = 1; i <= n; i++) bit[i] = 0;
  79.     }
  80.  
  81.     void update(int pos, T x) {
  82.         for(int i = pos; i <= n; i += i & (-i)) bit[i] += x;
  83.     }
  84.  
  85.     T get(int pos) {
  86.         T ans = 0;
  87.         for(int i = pos; i > 0; i -= i & (-i)) ans += bit[i];
  88.         return ans;
  89.     }
  90. };
  91.  
  92. int sz[N], pc[N], lg[N];
  93. bool visited[N];
  94. vector<pii> g[N];
  95. pii f[LOG + 2][N];
  96. int in[N], out[N], par[LOG + 2][N], depth[N];
  97. ll path[N], cnt[N], dist[N], roll[N];
  98. int Time = 0;
  99.  
  100. void dfs_sz(int u, int par) {
  101.     sz[u] = 1;
  102.     for(auto nxt : g[u]) {
  103.         int v = nxt.fi;
  104.         if(v != par && !visited[v]) {
  105.             dfs_sz(v, u);
  106.             sz[u] += sz[v];
  107.         }
  108.     }
  109. }
  110.  
  111. int centroid(int u, int par, int n) {
  112.     for(auto nxt : g[u]) {
  113.         int v = nxt.fi;
  114.         if(v != par && sz[v] * 2 > n && !visited[v]) return centroid(v, u, n);
  115.     }
  116.     return u;
  117. }
  118.  
  119. void build_centroid(int u, int par, int d) {
  120.     dfs_sz(u, 0);
  121.     u = centroid(u, 0, sz[u]);
  122.  
  123.     pc[u] = par;
  124.     visited[u] = true;
  125.  
  126.     for(auto nxt : g[u]) {
  127.         int v = nxt.fi;
  128.         if(!visited[v]) build_centroid(v, u, d + 1);
  129.     }
  130. }
  131.  
  132. void dfs(int u) {
  133.     f[0][++Time] = mp(depth[u], u);
  134.     in[u] = Time;
  135.     for(auto nxt : g[u]) {
  136.         int v = nxt.fi;
  137.         int w = nxt.se;
  138.         if(v != par[0][u]) {
  139.             depth[v] = depth[u] + 1;
  140.             par[0][v] = u;
  141.             path[v] = path[u] + w;
  142.             dfs(v);
  143.             f[0][++Time] = mp(depth[u], u);
  144.         }
  145.     }
  146.     out[u] = Time;
  147. }
  148.  
  149. int find_lca(int u, int v) {
  150.     if(in[u] > in[v]) swap(u, v);
  151.     int L = in[u], R = out[v];
  152.     int x = lg[R - L + 1];
  153.  
  154.     return (f[x][L].fi < f[x][R - (1 << x) + 1].fi ? f[x][L].se : f[x][R - (1 << x) + 1].se);
  155. }
  156.  
  157. ll find_dist(int u, int v) {
  158.     int p = find_lca(u, v);
  159.     return path[u] + path[v] - path[p] * 2;
  160. }
  161.  
  162. int find_par(int u, int d) {
  163.     if(depth[u] < d) return u;
  164.     int x = lg[depth[u] - d + 1];
  165.     for(int i = x; i >= 0; i--) {
  166.         if(depth[u] - (1 << i) >= d) u = par[i][u];
  167.     }
  168.     return u;
  169. }
  170.  
  171. void add(int u) {
  172.     int v = u;
  173.     while(v) {
  174.         ++cnt[v];
  175.         dist[v] += find_dist(u, v);
  176.         if(pc[v]) {
  177.             ++roll[v];
  178.             dist[v] -= find_dist(u, pc[v]);
  179.         }
  180.         v = pc[v];
  181.     }
  182. }
  183.  
  184. ll calc(int u) {
  185.     ll ans = 0;
  186.     int v = u;
  187.     while(v) {
  188.         ans += dist[v] + find_dist(u, v) * cnt[v] - roll[v] * (pc[v] ? find_dist(u, pc[v]) : 0);
  189.         v = pc[v];
  190.     }
  191.     return ans;
  192. }
  193.  
  194. void solve() {
  195.     int n; cin >> n;
  196.     for(int i = 1; i < n; i++) {
  197.         int u, v, w; cin >> u >> v >> w;
  198.         g[u].pb(mp(v, w));
  199.         g[v].pb(mp(u, w)); 
  200.     }
  201.  
  202.     lg[2] = 1;
  203.     for(int i = 2; i <= 2 * n; i++) lg[i] = lg[i / 2] + 1;
  204.  
  205.     FenwickTree<int> BIT = FenwickTree<int>(2 * n);
  206.  
  207.     build_centroid(1, 0, 1);
  208.  
  209.     depth[1] = 1;
  210.     dfs(1);
  211.  
  212.     for(int j = 1; j <= LOG; j++) {
  213.         for(int i = 1; i <= Time - (1 << j) + 1; i++) {
  214.             int u = i + (1 << (j - 1));
  215.             f[j][i] = (f[j - 1][i].fi < f[j - 1][u].fi ? f[j - 1][i] : f[j - 1][u]);
  216.         }
  217.     }
  218.  
  219.     for(int j = 1; j <= LOG; j++) {
  220.         for(int i = 1; i <= n; i++) {
  221.             if(depth[i] <= (1 << j)) continue;
  222.             int u = par[j - 1][i];
  223.             par[j][i] = par[j - 1][u];
  224.         }
  225.     }
  226.  
  227.     int node = 1;
  228.     cout << 0 << " ";
  229.     add(1);
  230.     BIT.update(in[1], 1);
  231.  
  232.     for(int i = 2; i <= n; i++) {
  233.         add(i);
  234.         BIT.update(in[i], 1);
  235.         int p = find_lca(node, i);
  236.         int L = 0, R = depth[i] + depth[node] - 2 * depth[p] - 1;
  237.  
  238.         int num;
  239.         int current = node;
  240.         int new_node = i;
  241.  
  242.         if(p != i) {
  243.             if(find_par(i, depth[current]) == current) {
  244.                 int u = find_par(i, depth[current] + 1);
  245.                 num = BIT.get(out[u]) - BIT.get(in[u] - 1);
  246.             } else {
  247.                 num = i - BIT.get(out[current]) + BIT.get(in[current] - 1);
  248.             }
  249.  
  250.             if(num * 2 <= i) {
  251.                 new_node = current;
  252.             }
  253.         } else {
  254.             int num = i - (BIT.get(out[current]) - BIT.get(in[current] - 1));
  255.             if(num * 2 <= i) {
  256.                 new_node = current;
  257.             }
  258.         }
  259.  
  260.         if(new_node == node) {
  261.             cout << calc(node) << " ";
  262.             continue;
  263.         }
  264.        
  265.         while(L <= R) {
  266.             int mid = (L + R) >> 1;
  267.             int dist = mid;
  268.             int current = 0;
  269.  
  270.             if(p != i) {
  271.                 int num, current;
  272.                 if(dist > depth[node] - depth[p]) {
  273.                     current = find_par(i, depth[p] + dist - (depth[node] - depth[p]));
  274.                 } else {
  275.                     current = find_par(node, depth[p] + depth[node] - depth[p] - dist);
  276.                 }
  277.  
  278.                 if(find_par(i, depth[current]) == current) {
  279.                     int u = find_par(i, depth[current] + 1);
  280.                     num = BIT.get(out[u]) - BIT.get(in[u] - 1);
  281.                 } else {
  282.                     num = i - BIT.get(out[current]) + BIT.get(in[current] - 1);
  283.                 }
  284.  
  285.                 if(num * 2 <= i) {
  286.                     R = mid - 1;
  287.                     new_node = current;
  288.                 } else L = mid + 1;
  289.             } else {
  290.                 current = find_par(node, depth[node] - dist);
  291.                 int num = i - (BIT.get(out[current]) - BIT.get(in[current] - 1));
  292.                 if(num * 2 <= i) {
  293.                     R = mid - 1;
  294.                     new_node = current;
  295.                 } else L = mid + 1;
  296.             }
  297.         }
  298.  
  299.         node = new_node;
  300.         cout << calc(node) << " ";
  301.     }
  302. }
  303.  
  304. int main()
  305. {
  306.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  307.     #ifndef ONLINE_JUDGE
  308.     freopen("input.txt", "r", stdin);
  309.     freopen("output.txt", "w", stdout);
  310.     #else
  311.     //online
  312.     freopen("tree.inp", "r", stdin);
  313.     freopen("tree.out", "w", stdout);
  314.     #endif
  315.  
  316.     int tc = 1, ddd = 0;
  317.     cin >> tc; tc = 1;
  318.     while(tc--) {
  319.         //ddd++;
  320.         //cout << "Case #" << ddd << ": ";
  321.         solve();
  322.     }
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement