Advertisement
welleyth

CEOI 2019 Day1 DynamicDiameter

Jul 23rd, 2022
1,103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. #define int long long
  8. #define mp make_pair
  9. #define pb push_back
  10.  
  11. #pragma GCC optimize("Ofast")
  12. #pragma GCC optimize("unroll-loops")
  13. #pragma GCC target("avx2")
  14.  
  15. constexpr int INF = (int)2e15;
  16. constexpr int N = (int)1e5 + 111;
  17. constexpr int md = (int)998244353;
  18. constexpr int mdPower = (int)1e9+7 - 1;
  19. constexpr double eps = 1e-7;
  20.  
  21. typedef __int128 _uint;
  22. typedef long long ll;
  23.  
  24. mt19937_64 rnd(time(nullptr));
  25.  
  26. void add(int& a,int b){
  27.     a += b; if(a >= md) a -= md;
  28. }
  29. void sub(int& a,int b){
  30.     a -= b; while(a < 0) a += md;
  31. }
  32. void add(__int128& a,int b){
  33.     a += b;
  34. }
  35. void sub(__int128& a,int b){
  36.     a -= b;
  37. }
  38.  
  39. int bpow(int a,int b){
  40.     if(b == 0)
  41.         return 1;
  42.     if(b % 2 == 0){
  43.         int t = bpow(a,b>>1);
  44.         return 1ll*t*t%md;
  45.     }
  46.     return 1ll * a*bpow(a,b-1) % md;
  47. }
  48.  
  49. int inv(int a){
  50.     return bpow(a,md-2);
  51. }
  52.  
  53. //int fac[N],invfac[N];
  54. //
  55. //void init(){
  56. //    fac[0] = 1;
  57. //    for(int i = 1; i < N; i++){
  58. //        fac[i] = (fac[i-1] * i) % md;
  59. //    }
  60. //    invfac[N-1] = inv(fac[N-1]);
  61. //    for(int i = N-2; i >= 0; i--){
  62. //        invfac[i] = (invfac[i+1] * (i+1))%md;
  63. //    }
  64. //    return;
  65. //}
  66. //
  67. //int C(int n,int k){
  68. //    if(k > n)
  69. //        return 0;
  70. //    return fac[n] * invfac[k] % md * invfac[n-k] % md;
  71. //}
  72. //
  73. //int A(int n,int k){
  74. //    if(k > n)
  75. //        return 0;
  76. //    return fac[n] * invfac[n-k] % md;
  77. //
  78.  
  79. vector<int> g[N];
  80. multiset<pair<int,int>> vals[N];
  81.  
  82. bool isCentroid[N];
  83. int sz[N];
  84. int root[20][N];
  85. int prevCentroid[N];
  86. int go[N];
  87.  
  88. void dfs1(int v,int pr = -1){
  89.     sz[v] = 1;
  90.     for(auto& to : g[v]){
  91.         if(to == pr || isCentroid[to])
  92.             continue;
  93.         dfs1(to,v);
  94.         sz[v] += sz[to];
  95.     }
  96.     return;
  97. }
  98.  
  99. int dfs2(int v,int& n,int pr = -1){
  100.     for(auto& to : g[v]){
  101.         if(pr == to || sz[to] < n/2)
  102.             continue;
  103.         return dfs2(to,n,v);
  104.     }
  105.     return v;
  106. }
  107.  
  108. vector<int> order;
  109. int tin[20][N],tout[20][N];
  110. int timer = {};
  111. int lvl[N];
  112.  
  113. void dfs3(int v,int d,int pr = -1){
  114.     order.pb(v);
  115.     tin[d][v] = timer;
  116.     for(auto& to : g[v]){
  117.         if(to == pr || isCentroid[to])
  118.             continue;
  119.         dfs3(to,d,v);
  120.     }
  121.     order.pb(v);
  122.     tout[d][v] = timer;
  123.     return;
  124. }
  125.  
  126. multiset<int> answer;
  127.  
  128. bool upper(int a,int b,int d){
  129.     return tin[d][a] <= tin[d][b] && tout[d][a] >= tout[d][b];
  130. }
  131.  
  132. int CentroidDecomposition(int v,int d = 0){
  133.     dfs1(v);
  134.     int cur = dfs2(v);
  135.     isCentroid[cur] = 1;
  136.     dfs3(cur,d);
  137.     lvl[cur] = d;
  138.     for(auto& to : g[cur]){
  139.         if(!isCentroid[to]){
  140.             int p = CentroidDecomposition(to,d+1);
  141.             prevCentroid[p] = v;
  142.             go[p] = to;
  143.         }
  144.     }
  145.     return cur;
  146. }
  147.  
  148. int t[4*20*N];
  149. int w[4*20*N];
  150.  
  151. void push(int v){
  152.     t[v<<1] += w[v];
  153.     t[v<<1|1] += w[v];
  154.     w[v<<1] += w[v];
  155.     w[v<<1|1] += w[v];
  156.     w[v] = 0;
  157.     return;
  158. }
  159.  
  160. void upd(int v,int l,int r,int tl,int tr,int x){
  161.     if(l > r || tl > tr)
  162.         return;
  163.     if(l == tl && r == tr){
  164.         t[v] += x;
  165.         w[v] += x;
  166.         return;
  167.     }
  168.     int m = (l+r)>>1;
  169.     push(v);
  170.     upd(v<<1,l,m,tl,min(tr,m),x);
  171.     upd(v<<1|1,m+1,r,max(m+1,tl),tr,x);
  172.     t[v] = max(t[v<<1],t[v<<1|1]);
  173.     return;
  174. }
  175.  
  176. int get(int v,int l,int r,int tl,int tr){
  177.     if(l > r || tl > tr)
  178.         return 0;
  179.     if(l == tl && r == tr)
  180.         return t[v];
  181.     int m = (l+r)>>1;
  182.     push(v);
  183.     return max(get(v<<1,l,m,tl,min(tr,m)),get(v<<1|1,m+1,r,max(m+1,tl),tr));
  184. }
  185.  
  186. void updEdge(int v,int d,int a,int b,int delta){
  187.     if(v == 0 || d < 0)
  188.         return;
  189.     if(upper(a,b,d))
  190.         swap(a,b);
  191.     upd(1,0,timer,tin[d][a],tout[d][a],delta);
  192.  
  193. }
  194.  
  195. void solve(){
  196.     int n,q,w;
  197.     cin >> n >> q >> w;
  198.  
  199.     for(int i = 1; i < n; i++){
  200.  
  201.     }
  202.  
  203.     return;
  204. }
  205.  
  206. signed main(){
  207.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  208.     int tests = 1;
  209.     cin >> tests;
  210.     for(int test = 1; test <= tests; test++){
  211. //        cerr << "test = " << test << "\n";
  212.         solve();
  213.     }
  214.     return 0;
  215. }
  216. /**
  217.  
  218. **/
  219.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement