题解:用树链剖分来维护树链剖分

令d[x]=size[heavyson[x]]-size[lightson[x]]

当d[x]<0时轻重儿子关系改变

用数据结构维护d[x]并找到这些位置改变即可

时间复杂度O(不会分析)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define lo now<<1
  5. #define ro now<<1|1
  6. using namespace std;
  7. const int maxn=200009;
  8.  
  9. int n,m;
  10.  
  11. long long nowans=0;
  12. int havein[maxn],root=0;
  13. int del[maxn];
  14.  
  15. int ls[maxn],rs[maxn];
  16. int father[maxn],siz[maxn],dep[maxn];
  17. int idp[maxn],top[maxn],ref[maxn],hson[maxn];
  18. void Dfs1(int now,int fa){
  19. father[now]=fa;
  20. dep[now]=dep[fa]+1;
  21. siz[now]=1;
  22. if(ls[now]){
  23. Dfs1(ls[now],now);
  24. siz[now]+=siz[ls[now]];
  25. if(siz[ls[now]]>siz[hson[now]])hson[now]=ls[now];
  26. }
  27. if(rs[now]){
  28. Dfs1(rs[now],now);
  29. siz[now]+=siz[rs[now]];
  30. if(siz[rs[now]]>siz[hson[now]])hson[now]=rs[now];
  31. }
  32. }
  33.  
  34. int dfsclock=0;
  35. void Dfs2(int now,int toppoint){
  36. if(now==toppoint)nowans-=now;
  37.  
  38. idp[now]=++dfsclock;
  39. ref[dfsclock]=now;
  40. top[now]=toppoint;
  41. if(!hson[now])return;
  42. Dfs2(hson[now],toppoint);
  43. if((ls[now])&&(ls[now]!=hson[now]))Dfs2(ls[now],ls[now]);
  44. if((rs[now])&&(rs[now]!=hson[now]))Dfs2(rs[now],rs[now]);
  45. }
  46.  
  47. struct SegmentTree{
  48. int l,r;
  49. int tag,mn;//siz[heavy[now]]-siz[light[son]]
  50. int havetop;//father[top[now]]
  51. }tree[maxn<<2];
  52. inline void pushup(int now){
  53. tree[now].mn=min(tree[lo].mn,tree[ro].mn);
  54. tree[now].havetop=(tree[lo].havetop|tree[ro].havetop);
  55. }
  56. inline void pushdown(int now){
  57. if(tree[now].tag){
  58. tree[lo].tag+=tree[now].tag;
  59. tree[ro].tag+=tree[now].tag;
  60. tree[lo].mn+=tree[now].tag;
  61. tree[ro].mn+=tree[now].tag;
  62. tree[now].tag=0;
  63. }
  64. }
  65.  
  66. void BuildTree(int now,int l,int r){
  67. tree[now].l=l;tree[now].r=r;
  68. tree[now].tag=0;
  69. if(l==r){
  70. int x=ref[l];
  71. tree[now].mn=siz[hson[x]]-min(siz[ls[x]],siz[rs[x]]);
  72. tree[now].havetop=0;
  73. return;
  74. }
  75. int mid=(l+r)>>1;
  76. BuildTree(lo,l,mid);
  77. BuildTree(ro,mid+1,r);
  78. pushup(now);
  79. }
  80.  
  81. void Updatasec(int now,int ll,int rr,int x){
  82. if(tree[now].l>=ll&&tree[now].r<=rr){
  83. tree[now].tag+=x;
  84. tree[now].mn+=x;
  85. return;
  86. }
  87. int mid=(tree[now].l+tree[now].r)>>1;
  88. pushdown(now);
  89. if(ll<=mid)Updatasec(lo,ll,rr,x);
  90. if(rr>mid)Updatasec(ro,ll,rr,x);
  91. pushup(now);
  92. }
  93.  
  94. void Updatatop(int now,int ll,int rr,int x){
  95. if(ll>rr)return;
  96. if(tree[now].r<ll)return;
  97. if(tree[now].l>rr)return;
  98. if(tree[now].l==tree[now].r){
  99. tree[now].mn+=x;
  100. return;
  101. }
  102. pushdown(now);
  103. if(tree[lo].havetop)Updatatop(lo,ll,rr,x);
  104. if(tree[ro].havetop)Updatatop(ro,ll,rr,x);
  105. pushup(now);
  106. }
  107.  
  108. void Changetop(int now,int ll,int rr){
  109. if(ll>rr)return;
  110. if(tree[now].r<ll)return;
  111. if(tree[now].l>rr)return;
  112. if(tree[now].l==tree[now].r){
  113. tree[now].mn=-tree[now].mn;
  114. tree[now].havetop=1;
  115. int x=ref[tree[now].l];
  116. if(ls[x]==hson[x]){
  117. nowans=nowans-ls[x]+rs[x];
  118. hson[x]=rs[x];
  119. }else{
  120. nowans=nowans-rs[x]+ls[x];
  121. hson[x]=ls[x];
  122. }
  123. return;
  124. }
  125. pushdown(now);
  126. if(tree[lo].mn<0)Changetop(lo,ll,rr);
  127. if(tree[ro].mn<0)Changetop(ro,ll,rr);
  128. pushup(now);
  129. }
  130.  
  131. void Updatapoint(int now,int p,int x){
  132. if(tree[now].l==tree[now].r){
  133. tree[now].mn+=x;
  134. if(tree[now].mn<0){
  135. tree[now].mn=-tree[now].mn;
  136. tree[now].havetop=0;
  137. int o=ref[p];
  138. if(ls[o]==hson[o]){
  139. nowans=nowans-ls[o]+rs[o];
  140. hson[o]=rs[o];
  141. }else{
  142. nowans=nowans-rs[o]+ls[o];
  143. hson[o]=ls[o];
  144. }
  145. }
  146. return;
  147. }
  148. int mid=(tree[now].l+tree[now].r)>>1;
  149. pushdown(now);
  150. if(p<=mid)Updatapoint(lo,p,x);
  151. else Updatapoint(ro,p,x);
  152. pushup(now);
  153. }
  154.  
  155. void ChangePath(int u){
  156. int x=u;
  157. while(x){
  158. int tx=top[x];
  159. Updatasec(1,idp[tx],idp[x],-1);
  160.  
  161. Updatatop(1,idp[tx],idp[x]-1,2);
  162. Changetop(1,idp[tx],idp[x]-1);
  163. // x=tx;int fa=father[x];
  164. // if(!fa)break;
  165. // if(hson[fa]!=x){
  166. // Updatapoint(1,idp[fa],2);
  167. // }else{
  168. // Updatapoint(1,idp[fa],0);
  169. // }
  170. x=father[tx];tx=top[x];
  171. }
  172. x=u;
  173. while(x){
  174. x=top[x];
  175. int fa=father[x];
  176. if(!fa)break;
  177. if(hson[fa]!=x){
  178. Updatapoint(1,idp[fa],2);
  179. }else{
  180. Updatapoint(1,idp[fa],0);
  181. }
  182. x=fa;
  183. }
  184. }
  185.  
  186. int main(){
  187. scanf("%d",&n);
  188. for(int i=1;i<=n;++i){
  189. scanf("%d%d",&ls[i],&rs[i]);
  190. havein[ls[i]]++;
  191. havein[rs[i]]++;
  192. }
  193. for(int i=1;i<=n;++i)nowans+=i;
  194. for(int i=1;i<=n;++i)if(!havein[i])root=i;
  195.  
  196. Dfs1(root,0);
  197. Dfs2(root,root);
  198. BuildTree(1,1,n);
  199.  
  200. scanf("%d",&m);
  201. printf("%lld\n",nowans);
  202. del[0]=1;
  203. while(m--){
  204. int x;scanf("%d",&x);
  205.  
  206. del[x]=1;
  207. ChangePath(x);
  208. if(ls[father[x]]==x){
  209. if(del[rs[father[x]]])nowans-=x;
  210. }else{
  211. if(del[ls[father[x]]])nowans-=x;
  212. }
  213. printf("%lld\n",nowans);
  214. }
  215. return 0;
  216. }

  

BZOJ 4855 [Jsoi2016]轻重路径的更多相关文章

  1. BZOJ4855 : [Jsoi2016]轻重路径

    首先用树状数组维护dfs序来快速支持一个点子树大小的询问. 每次删掉一个叶子时,从根开始往叶子走,显然只有$2size[x]\leq size[father]$的点的父亲才有可能换重儿子. 从根开始往 ...

  2. [JSOI2016]轻重路径[树链剖分]

    题意 题目链接 分析 先对原树树剖,在一次删点操作后从根节点开始二分,如果一条边从重边变成轻边,必然有 \(size_u\le \frac{1}{2}size_{rt}\) (取等号是特判对应儿子消失 ...

  3. BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划

    BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...

  4. BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算

    BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...

  5. 【LOJ】#2079. 「JSOI2016」轻重路径

    题解 写数据结构的时候我代码就会变得非常非常长 一看别人1.5K 2.3K 我6.3K-- orzzzzz 我们很容易想到离线倒着插入,然而,有个小锅叫如果size相同保持原来的重儿子不变 我们需要写 ...

  6. [BZOJ 1907] 树的路径覆盖 【树形DP】

    题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...

  7. BZOJ.3784.树上的路径(点分治 贪心 堆)

    BZOJ \(Description\) 给定一棵\(n\)个点的带权树,求树上\(\frac{n\times(n-1)}{2}\)条路径中,长度最大的\(m\)条路径的长度. \(n\leq5000 ...

  8. bzoj 3784: 树上的路径【点分治+st表+堆】

    参考:https://www.cnblogs.com/CQzhangyu/p/7071477.html 神奇的点分治序(或者叫点剖?).就是把点分治扫过的点依次放进队列里,然后发现,对于每一棵树摊到序 ...

  9. BZOJ 3784: 树上的路径

    Description 问一棵树上前 \(k\) 大路径的边权. Sol 边分治. 非常感谢数据没有菊花图. 为了写写边分治试试然后就开了这道题. 边分治非常好想,选一条重边,分成两部分,然后分别求最 ...

随机推荐

  1. PHP-WebShell-Bypass-WAF

    PHP-WebShell-Bypass-WAF PHP WebShell 一句话的结构是:输入和执行,这是经典的PHP 一句话代码: <?php eval($_GET['test']); ?&g ...

  2. net Core3.1 Swagger加JWT权限

    1.Swagger中开启JWT服务 #region swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new ...

  3. Essay Fail?可能是引用出了问题

    新学期伊始,又有不少成功与雅思分手的学生们海外入学.本以为可以稍微喘口气,却发现漫天的essay接踵而至.因此,Hotessay小编为新瓜蛋子们特地准备了一期essay写作的干货.还不赶紧学起来,用到 ...

  4. Java线程池 ThreadPoolExecutor类

    什么是线程池? java线程池是将大量的线程集中管理的类, 包括对线程的创建, 资源的管理, 线程生命周期的管理. 当系统中存在大量的异步任务的时候就考虑使用java线程池管理所有的线程, 从而减少系 ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-forward

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. 载域和运行域的理解(ARM程序是怎么运行的)

    对ARM加载域和运行域的理解 一般而言,一个程序包括只读的代码段和可读写的数据段.在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly):可读写的全局变量和静态变量被称作RW段( ...

  7. HDU - 6195 cable cable cable

    题意:如下图,有K个光源,一个光源可同时照射一个显示屏,问从M个显示屏中任选K个,可以使每个显示屏都被不同光源照亮最少需要多少连接电缆. 分析:画图分析可知 1.选1~K个显示屏和选M-K+1~M个显 ...

  8. 杂记 -- 关于ref、kepp-alive、nextTick、fetch

    1.ref:定义一个普通的dom节点或一个vue的组件实例对象 定义方法: <div class="page1"> <button @click="li ...

  9. kafka cmd with ssl

    set PATH=C:\Program Files\Java\jdk1.8.0_201\bin;@call kafka-consumer-groups.bat --bootstrap-server l ...

  10. C# Stream篇(二) -- TextReader 和StreamReader

    TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简 ...