1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e6+5;
  4. int n,m;
  5. int e,begin[maxn],next[maxn],to[maxn],val[maxn];
  6. struct segment_tree{
  7. int l,r,sum,mark;
  8. }tree[maxn<<2];
  9. int son[maxn],id[maxn],father[maxn],cnt,deep[maxn],size[maxn],top[maxn];
  10. inline void add(int x,int y){
  11. to[++e] = y;
  12. next[e] = begin[x];
  13. begin[x] = e;
  14. }
  15. inline void dfs1(int x,int fa,int dep){
  16. deep[x] = dep;
  17. father[x] = fa;
  18. size[x] = 1;
  19. int maxson = -1;
  20. for(int i = begin[x];i;i = next[i]){
  21. int y = to[i];
  22. if(y == fa)continue;
  23. dfs1(y,x,dep+1);
  24. size[x] += size[y];
  25. if(size[y] > maxson)son[x] = y,maxson = size[y];
  26. }
  27. }
  28. inline void dfs2(int x,int ntop){
  29. id[x] = ++cnt;
  30. top[x] = ntop;
  31. if(!son[x])return;
  32. dfs2(son[x],ntop);
  33. for(int i = begin[x];i;i = next[i]){
  34. int y = to[i];
  35. if(y == father[x] || y == son[x])continue;
  36. dfs2(y,y);
  37. }
  38. }
  39. inline void pushup(int root){
  40. tree[root].sum = tree[root<<1].sum+tree[root<<1|1].sum;
  41. }
  42. inline void pushdown(int root){
  43. if (tree[root].mark){
  44. tree[root<<1].mark = tree[root].mark;
  45. tree[root<<1|1].mark = tree[root].mark;
  46. tree[root<<1].sum = (tree[root].mark-1)*(tree[root<<1].r-tree[root<<1].l+1);
  47. tree[root<<1|1].sum = (tree[root].mark-1)*(tree[root<<1|1].r-tree[root<<1|1].l+1);
  48. tree[root].mark = 0;
  49. }
  50. }
  51. inline void build(int l,int r,int root){
  52. tree[root].l = l;
  53. tree[root].r = r;
  54. if(l == r)return;
  55. int mid = l+r>>1;
  56. build(l,mid,root<<1);
  57. build(mid+1,r,root<<1|1);
  58. pushup(root);
  59. }
  60. inline void update(int l,int r,int ql,int qr,int root,int x){
  61. if(ql > r || qr < l)return;
  62. if(ql <= l && qr >= r){
  63. tree[root].mark = x+1;
  64. tree[root].sum = x*(r-l+1);
  65. return;
  66. }
  67. pushdown(root);
  68. int mid = l+r>>1;
  69. update(l,mid,ql,qr,root<<1,x);
  70. update(mid+1,r,ql,qr,root<<1|1,x);
  71. pushup(root);
  72. }
  73. inline int query(int l,int r,int ql,int qr,int root){
  74. if(ql > r || qr < l)return 0;
  75. if(ql <= l && qr >= r)return tree[root].sum;
  76. pushdown(root);
  77. int mid = l+r>>1;
  78. return query(l,mid,ql,qr,root<<1)+query(mid+1,r,ql,qr,root<<1|1);
  79. }
  80. inline int Query(int l,int r,int ql,int qr,int root){
  81. if(ql > r || qr < l)return 0;
  82. if(ql <= l && qr >= r)return (r-l+1)-tree[root].sum;
  83. pushdown(root);
  84. int mid = l+r>>1;
  85. return Query(l,mid,ql,qr,root<<1)+Query(mid+1,r,ql,qr,root<<1|1);
  86. }
  87. inline void update_range(int u,int v,long long x){
  88. while(top[u] != top[v]){
  89. if(deep[top[u]] < deep[top[v]])swap(u,v);
  90. update(1,cnt,id[top[u]],id[u],1,x);
  91. u = father[top[u]];
  92. }
  93. if(deep[u] > deep[v])swap(u,v);
  94. update(1,cnt,id[u],id[v],1,x);
  95. }
  96. inline int query_range(int u,int v){
  97. int ans = 0;
  98. while(top[u] != top[v]){
  99. if (deep[top[u]] < deep[top[v]])swap(u,v);
  100. ans += Query(1,cnt,id[top[u]],id[u],1);
  101. u = father[top[u]];
  102. }
  103. if(deep[u] > deep[v])swap(u,v);
  104. return ans+Query(1,cnt,id[u],id[v],1);
  105. }
  106. int main() {
  107. cin>>n;
  108. for(int i = 2,x;i <= n;i++){
  109. cin>>x;
  110. x++;
  111. add(x,i);
  112. }
  113. dfs1(1,0,1);
  114. dfs2(1,1);
  115. build(1,cnt,1);
  116. cin>>m;
  117. while(m--){
  118. string dispose;
  119. int x;
  120. cin>>dispose>>x;
  121. x++;
  122. if(dispose == "install"){
  123. cout<<query_range(1,x)<<endl;
  124. update_range(1,x,1);
  125. }
  126. else{
  127. cout<<query(1,cnt,id[x],id[x]+size[x]-1,1)<<endl;
  128. update(1,cnt,id[x],id[x]+size[x]-1,1,0);
  129. }
  130. }
  131. return 0;
  132. }

  树链剖分这东西我还是只会用一点点,所以讲不出来做法,有的题实在心态爆炸看别人代码会发现真的是细节决定成败,以后尽量可以把思路讲出来,现在的状况是:只可意会不可言传!!!~~~

[NOI2015]软件包管理器-树链剖分的更多相关文章

  1. 【BZOJ4196】[Noi2015]软件包管理器 树链剖分

    [Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...

  2. Bzoj 4196: [Noi2015]软件包管理器 树链剖分

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 721  Solved: 419[Submit][Statu ...

  3. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  4. [BZOJ4196][NOI2015]软件包管理器(树链剖分)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2166  Solved: 1253[Submit][Sta ...

  5. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  6. 洛谷 P2146 [NOI2015]软件包管理器 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...

  7. 【bzoj4196】[Noi2015]软件包管理器 树链剖分+线段树

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  8. NOI2015 软件包管理器(树链剖分+线段树)

    P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...

  9. BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

随机推荐

  1. 【原创】新说Mysql事务隔离级别

    引言 大家在面试中一定碰到过 说说事务的隔离级别吧? 老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!因为他们对可重复读 ...

  2. HTML5新增特性

    1. 语义化标签 2. 增强型表单 (1)新的表单输入类型 (2)新表单元素 (3)新表单属性 3. 视频和音频 4. Canvas绘图(图形.路径.文本.渐变.图像) 5. SVG绘图 (与Canv ...

  3. JS 灵活使用 console 调试

    前言: Web 开发中最常用的调试就是 console.log(),console 除了 本身 log() 方法外,还有其他很多方法. console.log() console.log() 有许多意 ...

  4. 使用VMware安装Ubuntu虚拟机,创建后开启显示黑屏的解决方法

    将使用的VMware-workstation-full-14.0.0.24051卸载改为使用VMware-workstation_full_12.1.1.6932. 安装VMware成功后,创建新的虚 ...

  5. (PAT)L2-012 关于堆的判断 (最小堆)

    题目链接:https://www.patest.cn/contests/gplt/L2-012 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “ ...

  6. 控制结构(6): 最近最少使用(LRU)

    // 上一篇:必经之地(using) // 下一篇:程序计数器(PC) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. There are only two hard thin ...

  7. 如何伪造IP(转)

    要明白伪装IP的原理,首先要回顾一下TCP的三次握手. 总所周知在链接初始化的阶段, 需要一次三次握手来建立链接, 之后客户端和服务端会依据初始的这个IP地址来通信. 从这个角度上来说, 想真正的伪装 ...

  8. 6-3 Articles(a, an, some, the)

    1 Definite and Indifinite articles Indefinite articles: a, an, some Definite article:  the 2 a and t ...

  9. Microsoft Visual Studio Tools for AI

    https://www.visualstudio.com/zh-hans/downloads/ai-tools-vs/ 开发.调试和部署深度学习和 AI 解决方案 Visual Studio Tool ...

  10. Djangon

    2.怎么样从浏览器获得用户输入的数据? request.浏览器的八种申请方式.get(条件) request.浏览器的八种申请方式[] request.浏览器的八种申请方式(这里什么也不要写)> ...