安装就把根节点到它全设为 1

删除就把以它为根的子树全设为 0

记得标记初始化为-1,因为标记是 0 的情况也是要处理的。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. int n, m, uu, hea[100005], cnt, dep[100005], fa[100005], son[100005], siz[100005];
  6. int top[100005], idx[100005], qwq;
  7. char ss[15];
  8. struct Edge{
  9. int too, nxt;
  10. }edge[200005];
  11. struct SGT{
  12. int sum[400005], tag[400005];
  13. void build(int o, int l, int r){
  14. tag[o] = -1;
  15. if(l==r) sum[o] = 0;
  16. else{
  17. int mid=(l+r)>>1;
  18. int lson=o<<1;
  19. int rson=lson|1;
  20. if(l<=mid) build(lson, l, mid);
  21. if(mid<r) build(rson, mid+1, r);
  22. sum[o] = sum[lson] + sum[rson];
  23. }
  24. }
  25. void pushDown(int o, int l, int r, int lson, int rson, int mid){
  26. tag[lson] = tag[o];
  27. tag[rson] = tag[o];
  28. sum[lson] = (mid-l+1) * tag[o];
  29. sum[rson] = (r-mid) * tag[o];
  30. tag[o] = -1;
  31. }
  32. void update(int o, int l, int r, int x, int y, int k){
  33. if(l>=x && r<=y){
  34. sum[o] = (r-l+1) * k;
  35. tag[o] = k;
  36. }
  37. else{
  38. int mid=(l+r)>>1;
  39. int lson=o<<1;
  40. int rson=lson|1;
  41. if(tag[o]!=-1) pushDown(o, l, r, lson, rson, mid);
  42. if(x<=mid) update(lson, l, mid, x, y, k);
  43. if(mid<y) update(rson, mid+1, r, x, y, k);
  44. sum[o] = sum[lson] + sum[rson];
  45. }
  46. }
  47. }sgt;
  48. void add_edge(int fro, int too){
  49. edge[++cnt].nxt = hea[fro];
  50. edge[cnt].too = too;
  51. hea[fro] = cnt;
  52. }
  53. void dfs1(int x, int f){
  54. dep[x] = dep[f] + 1;
  55. fa[x] = f;
  56. siz[x] = 1;
  57. int maxSon=-1;
  58. for(int i=hea[x]; i; i=edge[i].nxt){
  59. int t=edge[i].too;
  60. if(t!=f){
  61. dfs1(t, x);
  62. siz[x] += siz[t];
  63. if(siz[t]>maxSon) maxSon = siz[t], son[x] = t;
  64. }
  65. }
  66. }
  67. void dfs2(int x, int topf){
  68. top[x] = topf;
  69. idx[x] = ++qwq;
  70. if(!son[x]) return ;
  71. dfs2(son[x], topf);
  72. for(int i=hea[x]; i; i=edge[i].nxt){
  73. int t=edge[i].too;
  74. if(t!=fa[x] && t!=son[x])
  75. dfs2(t, t);
  76. }
  77. }
  78. void upd(int xx, int yy){
  79. while(top[xx]!=top[yy]){
  80. if(dep[top[xx]]<dep[top[yy]]) swap(xx, yy);
  81. sgt.update(1, 1, n, idx[top[xx]], idx[xx], 1);
  82. xx = fa[top[xx]];
  83. }
  84. if(dep[xx]>dep[yy]) swap(xx, yy);
  85. sgt.update(1, 1, n, idx[xx], idx[yy], 1);
  86. }
  87. int main(){
  88. cin>>n;
  89. for(int i=2; i<=n; i++){
  90. scanf("%d", &uu);
  91. add_edge(i, uu+1);
  92. add_edge(uu+1, i);
  93. }
  94. dfs1(1, 0);
  95. dfs2(1, 1);
  96. sgt.build(1, 1, n);
  97. cin>>m;
  98. while(m--){
  99. scanf("%s %d", ss, &uu);
  100. uu++;
  101. if(ss[0]=='i'){
  102. int tmp=sgt.sum[1];
  103. upd(1, uu);
  104. printf("%d\n", sgt.sum[1]-tmp);
  105. }
  106. else{
  107. int tmp=sgt.sum[1];
  108. sgt.update(1, 1, n, idx[uu], idx[uu]+siz[uu]-1, 0);
  109. printf("%d\n", tmp-sgt.sum[1]);
  110. }
  111. }
  112. return 0;
  113. }

luogu2146 [NOI2015]软件包管理器的更多相关文章

  1. [题解向] Luogu2146[NOI2015]软件包管理器

    #\(\mathcal{\color{red}{Description}}\) \(Link\) 一道\(zz\)的树剖题\(qwq\). #\(\mathcal{\color{red}{Soluti ...

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

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

  3. [BZOJ4196][NOI2015]软件包管理器

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

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

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

  5. [NOI2015]软件包管理器

    4621 [NOI2015]软件包管理器  题目等级 : 钻石 Diamond   题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...

  6. BZOJ_4196_[Noi2015]软件包管理器_树链剖分

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

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

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

  8. 洛谷 P2146 [NOI2015]软件包管理器 解题报告

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

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

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

随机推荐

  1. python学习day11

    目录 SqlAlchemy 外键 SqlAlechemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象 ...

  2. ListView与ScrollView冲突的4种解决方案

    问题解决方案1.手动设置ListView高度    经过测试发现,在xml中直接指定ListView的高度,是可以解决这个问题的,但是ListView中的数据是可变的,实际高度还需要实际测量.于是手动 ...

  3. RStudio的Markdown

    Title This is an R Markdown document. Markdown is a simple formatting syntax for authoring web pages ...

  4. 诊断 Grid Infrastructure 启动问题 (文档 ID 1623340.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.1 和更高版本本文档所含信息适用于所有平台 用途 本文提供了诊断 11GR2 和 12C G ...

  5. NTFS文件系统结构及文件恢复

    结构部分参考了 https://www.cnblogs.com/mwwf-blogs/archive/2015/05/04/4467687.html 以及P老师的课件.  文件恢复参考: https: ...

  6. react中的setState的使用和深入理解

    前端框架从MVC过渡到MVVM.从DOM操作到数据驱动,一直在不断的进步着,提升着, angular中用的是watcher对象,vue是观察者模式,react就是state了,他们各有各的特点,没有好 ...

  7. java导入Excel表格数据

    首先导入Excel数据需要几样东西 第一需要两个依赖包,这里直接是在pom注入依赖 <!--excel--> <dependency> <groupId>org.a ...

  8. Open Cascade:AIS_InteractiveContext如何调用函数选择AIS对象

    AIS_InteractiveContext如何调用函数选择AIS对象 myAISContext->MoveTo(point.x, point.y, myView); myAISContext- ...

  9. 如何移除 Navicat Premium for Mac 的所有文件

    作者:郭文峰链接:http://www.zhihu.com/question/24210959/answer/34579422来源:知乎著作权归作者所有,转载请联系作者获得授权. 数据库连接信息存放在 ...

  10. Luogu P2397 yyy loves Maths VI (mode)

    题目传送门 虽然只是一道黄题,但还是学到了一点新知识-- 摩尔投票法 用\(O(1)\)的内存,\(O(n)\)的时间来找出一串长度为n的数中的众数,前提是众数出现的次数要大于\(n/2\) 方法很简 ...