大概算是一道模板题吧?

就是细节有点多

罗列一下:

  1. 如果习惯从1开始搞树的编号的话,处理输入进来的那个依赖关系在加边的时候两个都要+1,体现在代码就是i要从2枚举到n,然后输入进来的那个数要+1
  2. 这道题的线段树的打法也有所不同,因为只有两种状态,也就是已安装和未安装,我这里是用1和0来表示的,所以lazy标记就不能打成0了,我的代码中是用-1来表示的,注意要判这个东西(当然你也可以用1和2表示这两种状态)
  3. 线段树的修改也要改一下,+=得改成=(显然?)

这些细节都处理好后就是一个树剖模板了

  1. #include <cstdio>
  2. #include <cstring>
  3. #define ll int
  4. #define inf 1<<30
  5. #define il inline
  6. il ll max(ll x,ll y){return x>y?x:y;}
  7. il ll min(ll x,ll y){return x<y?x:y;}
  8. il ll abs(ll x){return x>?x:-x;}
  9. il void swap(ll &x,ll &y){ll t=x;x=y;y=t;}
  10. il void read(ll &x){
  11. x=;ll f=;char c=getchar();
  12. while(c<''||c>''){if(c=='-')f=-f;c=getchar();}
  13. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  14. x*=f;
  15. }
  16. il void print(ll x){if(x<)putchar('-');x=abs(x);if(x>)print(x/);putchar(x%+'');}
  17. il void writeln(ll x){if(x<)putchar('-');x=abs(x);print(x);putchar('\n');}
  18. il void write(ll x){if(x<)putchar('-');x=abs(x);print(x);putchar(' ');}
  19. using namespace std;
  20. /*===================Header Template=====================*/
  21. #define N 100010
  22. struct edge{ll to,next;}e[N<<];
  23. struct tree{ll l,r,sum,lazy;}t[N<<];
  24. ll cnt,head[N],sz,n,m,a[N];
  25. ll pos[N],fa[N],dep[N],siz[N],top[N];
  26. void insert(ll u,ll v){
  27. e[++cnt].next=head[u];e[cnt].to=v;head[u]=cnt;
  28. e[++cnt].next=head[v];e[cnt].to=u;head[v]=cnt;
  29. }
  30. void dfs1(ll x){
  31. siz[x]=;
  32. for(ll i=head[x];i;i=e[i].next){
  33. if(fa[x]==e[i].to)continue;
  34. dep[e[i].to]=dep[x]+;
  35. fa[e[i].to]=x;
  36. dfs1(e[i].to);
  37. siz[x]+=siz[e[i].to];
  38. }
  39. }
  40. void dfs2(ll x,ll topf){
  41. ll k=;
  42. pos[x]=++sz;
  43. top[x]=topf;
  44. for(ll i=head[x];i;i=e[i].next){
  45. if(dep[e[i].to]>dep[x]&&siz[e[i].to]>siz[k])
  46. k=e[i].to;
  47. }
  48. if(k==)return;
  49. dfs2(k,topf);
  50. for(ll i=head[x];i;i=e[i].next){
  51. if(dep[e[i].to]>dep[x]&&k!=e[i].to){
  52. dfs2(e[i].to,e[i].to);
  53. }
  54. }
  55. }
  56. void pushdown(ll ln,ll rn,ll rt){
  57. if(t[rt].lazy!=-){
  58. ll &x=t[rt].lazy;
  59. t[rt<<].sum=ln*x;
  60. t[rt<<|].sum=rn*x;
  61. t[rt<<].lazy=x;
  62. t[rt<<|].lazy=x;
  63. x=-;
  64. }
  65. }
  66. void build(ll l,ll r,ll rt){
  67. t[rt].l=l;t[rt].r=r;t[rt].lazy=-;
  68. if(l==r)return;
  69. ll mid=(l+r)>>;
  70. build(l,mid,rt<<);
  71. build(mid+,r,rt<<|);
  72. }
  73. void upd(ll L,ll R,ll c,ll rt){
  74. ll l=t[rt].l,r=t[rt].r,mid=(l+r)>>;
  75. if(L<=l&&r<=R){t[rt].sum=(r-l+)*c;t[rt].lazy=c;return;}
  76. pushdown(mid-l+,r-mid,rt);
  77. if(L<=mid)upd(L,R,c,rt<<);
  78. if(R>mid)upd(L,R,c,rt<<|);
  79. t[rt].sum=t[rt<<].sum+t[rt<<|].sum;
  80. }
  81. ll query(ll L,ll R,ll rt){
  82. ll l=t[rt].l,r=t[rt].r,mid=(l+r)>>,ans=;
  83. if(L<=l&&r<=R)return t[rt].sum;
  84. pushdown(mid-l+,r-mid,rt);
  85. if(L<=mid)ans+=query(L,R,rt<<);
  86. if(R>mid)ans+=query(L,R,rt<<|);
  87. return ans;
  88. }
  89. void A(ll x,ll y){
  90. while(top[x]!=top[y]){
  91. if(dep[top[x]]<dep[top[y]])swap(x,y);
  92. upd(pos[top[x]],pos[x],,);
  93. x=fa[top[x]];
  94. }
  95. if(pos[x]>pos[y])swap(x,y);
  96. upd(pos[x],pos[y],,);
  97. }
  98. ll Q(ll x,ll y){
  99. ll sum=;
  100. while(top[x]!=top[y]){
  101. if(dep[top[x]]<dep[top[y]])swap(x,y);
  102. sum+=query(pos[top[x]],pos[x],);
  103. x=fa[top[x]];
  104. }
  105. if(pos[x]>pos[y])swap(x,y);
  106. sum+=query(pos[x],pos[y],);
  107. return sum;
  108. }
  109. int main(){
  110. read(n);
  111. for(ll i=;i<=n;i++){
  112. ll x;read(x);x++;
  113. insert(i,x);
  114. }
  115. dfs1();dfs2(,);
  116. build(,n,);
  117. upd(,n,,);
  118. read(m);
  119. while(m--){
  120. char ch[];ll x;
  121. scanf("%s%d",ch,&x);x++;
  122. if(ch[]=='i'){writeln(Q(x,));A(x,);}
  123. if(ch[]=='u'){
  124. writeln(siz[x]-query(pos[x],pos[x]+siz[x]-,));
  125. upd(pos[x],pos[x]+siz[x]-,,);
  126. }
  127. }
  128. return ;
  129. }

转载请注明出处:https://www.cnblogs.com/henry-1202/p/9152370.html

[bzoj 4196][NOI 2015]软件包管理器的更多相关文章

  1. [NOI 2015]软件包管理器

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

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

    第一次做树剖 找同学要了模板 + 各种借鉴 先用dfs在划分轻重链并编号, install的时候就从查询的节点到根寻找标记的点有多少个,再用深度减去标记的点的个数,并把路径上所有点都标记 uninst ...

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

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

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

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

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

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

  6. bzoj 4196: [Noi2015]软件包管理器

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

  7. 【刷题】BZOJ 4196 [Noi2015]软件包管理器

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

  8. 软件包管理器(bzoj 4196)

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

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

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

随机推荐

  1. 准备mybatis-spring

    spring-mybatis下载:https://mvnrepository.com/artifact/org.mybatis/mybatis-spring 导入mybatis-spring-2.0. ...

  2. HTML标签-----article、aside、figure、nav和section

       article    <article> 标签定义独立的内容 <!DOCTYPE html> <html> <head> <meta cha ...

  3. jQuery文档操作--empty()和remove()

    empty() 概述 删除匹配的元素集合中所有的子节点 <!DOCTYPE html> <html> <head> <meta charset="U ...

  4. eclipse更换workspace需要重新设置的内容

    .jdk Window-->java-->Installed JREs,新增或修改你所需要的jdk版本,点击需要的jdk-->edit 在Default VM arguments里面 ...

  5. C++前置声明

    [1]一般的前置函数声明 见过最多的前置函数声明,基本格式代码如下: #include <iostream> using namespace std; void fun(char ch, ...

  6. 使用Python中的config配置

    Python中有ConfigParser类,可以很方便的从配置文件中读取数据(如DB的配置,路径的配置),所以可以自己写一个函数,实现读取config配置. config文件的写法比较简单,[sect ...

  7. mybatis源码解析7---MappedStatement初始化过程

    上一篇我们了解到了MappedStatement类就是mapper.xml中的一个sql语句,而Configuration初始化的时候会加载所有的mapper接口类,而本篇再分析下是如何将mapper ...

  8. AI赌神称霸德扑的秘密,刚刚被《科学》“曝光”了

    AI赌神称霸德扑的秘密,刚刚被<科学>“曝光”了 称霸德州扑克赛场的赌神Libratus,是今年最瞩目的AI明星之一. 刚刚,<科学>最新发布的预印版论文,详细解读了AI赌神背 ...

  9. PyCharm 2017.2.3 版本在2017年9月7日发布,支持 Docker Compose

    PyCharm是由JetBrains打造的一款Python IDE.PyCharm具备用于一般IDE的功能,比如, 调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制 ...

  10. 关于setInterval的坑

    一道面试题:“setInterval和setTimeout有什么区别” “如果setInterval计时器的回调函数执行完需要5秒,而计时器时间间隔为3秒,那会发生什么?” 验证代码 让程序滞留固定时 ...