题解

树剖模板题,每次改变是\(1\)或者是\(0\),区间求和和区间修改就可了。

ac代码

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <algorithm>
  4. # include <ctype.h>
  5. # include <iostream>
  6. # include <cmath>
  7. # include <map>
  8. # include <vector>
  9. # include <queue>
  10. # define LL long long
  11. # define ms(a,b) memset(a,b,sizeof(a))
  12. # define ri (register int)
  13. # define inf (0x7f7f7f7f)
  14. # define pb push_back
  15. # define fi first
  16. # define se second
  17. # define pii pair<int,int>
  18. # define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
  19. using namespace std;
  20. inline int gi(){
  21. int w=0,x=0;char ch=0;
  22. while(!isdigit(ch)) w|=ch=='-',ch=getchar();
  23. while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
  24. return w?-x:x;
  25. }
  26. # define N 100005
  27. struct segment_tree{
  28. # define mid ((l+r)>>1)
  29. # define ls (nod<<1)
  30. # define rs (nod<<1|1)
  31. struct node{
  32. int l,r,s,tag;
  33. }tr[N<<2];
  34. void pushup(int nod){
  35. tr[nod].s=tr[ls].s+tr[rs].s;
  36. }
  37. void pushdown(int nod){
  38. int tmp=tr[nod].tag; tr[nod].tag=-1;
  39. if (tmp==-1) return;
  40. tr[ls].s=(tr[ls].r-tr[ls].l+1)*tmp;
  41. tr[rs].s=(tr[rs].r-tr[rs].l+1)*tmp;
  42. tr[ls].tag=tr[rs].tag=tmp;
  43. }
  44. void build(int l,int r,int nod){
  45. tr[nod].l=l,tr[nod].r=r,tr[nod].tag=-1,tr[nod].s=0;
  46. if (l>=r) return;
  47. build(l,mid,ls); build(mid+1,r,rs);
  48. pushup(nod);
  49. }
  50. void update_sec(int ql,int qr,int v,int nod){
  51. int l=tr[nod].l,r=tr[nod].r;
  52. if (ql<=l&&r<=qr){
  53. tr[nod].tag=v;
  54. tr[nod].s=(r-l+1)*v;
  55. return;
  56. }
  57. pushdown(nod);
  58. if (ql<=mid) update_sec(ql,qr,v,ls);
  59. if (qr>mid) update_sec(ql,qr,v,rs);
  60. pushup(nod);
  61. }
  62. }tr;
  63. struct edge{
  64. int to,nt;
  65. }E[N<<1];
  66. int son[N],top[N],sz[N],fa[N],H[N],dep[N],idx[N],pre[N];
  67. int cnt,tot,n,m;
  68. void addedge(int u,int v){
  69. E[++cnt]=(edge){v,H[u]}; H[u]=cnt;
  70. }
  71. void dfs1(int u,int ft,int dp){
  72. dep[u]=dp; fa[u]=ft; sz[u]=1;
  73. int maxson=-1;
  74. for (int e=H[u];e;e=E[e].nt){
  75. int v=E[e].to; if (v==fa[u]) continue;
  76. dfs1(v,u,dp+1); sz[u]+=sz[v];
  77. if (sz[v]>maxson) maxson=sz[v],son[u]=v;
  78. }
  79. }
  80. void dfs2(int u,int tp){
  81. top[u]=tp; idx[u]=++tot; pre[tot]=u;
  82. if (!son[u]) return; dfs2(son[u],tp);
  83. for (int e=H[u];e;e=E[e].nt){
  84. int v=E[e].to; if (v==fa[u]||v==son[u]) continue;
  85. dfs2(v,v);
  86. }
  87. }
  88. void update(int u,int v,int w){
  89. while (top[u]!=top[v]){
  90. if (dep[top[u]]<dep[top[v]]) swap(u,v);
  91. tr.update_sec(idx[top[u]],idx[u],w,1);
  92. u=fa[top[u]];
  93. }
  94. if (dep[u]>dep[v]) swap(u,v);
  95. tr.update_sec(idx[u],idx[v],w,1);
  96. }
  97. int main(){
  98. // freopen("data.in","r",stdin);
  99. // freopen("data.out","w",stdout);
  100. n=gi();
  101. for (int i=2;i<=n;i++){
  102. int u=gi();
  103. addedge(u+1,i);
  104. addedge(i,u+1);
  105. }
  106. m=gi();
  107. dfs1(1,-1,1);
  108. dfs2(1,1);
  109. tr.build(1,n,1);
  110. while (m--){
  111. char opt[10];
  112. scanf("%s",opt);
  113. int t1=tr.tr[1].s,x=gi(); x++;
  114. if (opt[0]=='i') update(1,x,1); else tr.update_sec(idx[x],idx[x]+sz[x]-1,0,1);
  115. int t2=tr.tr[1].s;
  116. printf("%d\n",abs(t1-t2));
  117. }
  118. return 0;
  119. }

[luogu1912][bzoj4196][NOI2015]软件管理器的更多相关文章

  1. [UOJ#128][BZOJ4196][Noi2015]软件包管理器

    [UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...

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

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

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

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

  4. [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

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

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

  6. BZOJ4196 [Noi2015]软件包管理器 【树剖】

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

  7. BZOJ4196: [Noi2015]软件包管理器(树链剖分)

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

  8. [Bzoj4196] [NOI2015] 软件包管理器 [树链剖分,线段树]

    题解摘要:树链剖分后用线段树区间查询修改,对于安装软件,将改点到根的路径全部变为1,对于卸载软件,将子树清空.注意边界,编号是从0开始的,容易漏掉树根. 第一次写树剖- #include <io ...

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

    先把树剖分了(又是dfs1.dfs2),然后区间求和.区间覆盖即可 难得的1A好(shui)题 ——写了那么多题,终于有一道是1A的了,加上上一次连续交了几遍A的程序,我的状态莫名好看啊233 总结: ...

随机推荐

  1. 搭建SpringBoot+dubbo+zookeeper+maven框架(一)

    这几天项目还没来,所以就自己试着参考网上的一些资料,搭建了一个SpringBoot+dubbo+zookeeper+maven框架,网上参考的很多资料照着他们一步一步搭建,最后很多都运行不通,很是郁闷 ...

  2. Scala学习(六)---Scala对象

    Scala中的对象 摘要: 在本篇中,你将会学到何时使用Scala的object语法结构.在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,你就会用到它.本篇的要点包括: 1. ...

  3. 个人java框架 技术分析

    1.框架选型 spring-boot https://github.com/JeffLi1993/springboot-learning-example https://mp.weixin.qq.co ...

  4. 行业干货-如何逆向解决QT程序汉化中乱码问题

    前言 “一款QT开发的国外软件,大概率是没有做中文支持的,所以你汉化中,不论怎么设置编码都一定是乱码.面对这个问题,你去互联网上找答案,答案却大多是复制粘贴的开发中解决乱码的文章,可是我们是要逆向中解 ...

  5. 手机APP自动化之uiautomator2 +python3 UI自动化

    题记: 之前一直用APPium直到用安卓9.0  发现uiautomatorviewer不支持安卓 9.0,点击截屏按钮 一直报错,百度很久解决方法都不可以,偶然间看见有人推荐:uiautomator ...

  6. Houdini toolset environment variable setting

    Game Development Toolset HOUDINI_PATH = "C:\Users\fooldrifter\Documents\houdini17.5\GameDevelop ...

  7. C_数据结构_递归自己调用自己

    # include <stdio.h> void f(int n) { ) printf("哈哈\n"); else f(n-i); } int main(void) ...

  8. 作业20171116 beta2及beta发布 成绩

    申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月13日 17:00. 成绩 scrum01 scrum02 scrum03 scrum04 scrum05 sc ...

  9. 【2016.3.22】作业 Word count 小程序

    今天更下word count程序的设计思路及实现方法. 我的程序贴在coding里,这里就先不贴出来了, 我的coding地址:https://coding.net/u/holy_angel/p/wo ...

  10. githup地址

    githup地址:https://github.com/caowenjing/test.git