题面:https://www.luogu.org/problemnew/lists?name=2146

这道题要用树链剖分,我博客里有对树链剖分的详细介绍

这道题就是树链剖分的模板,详细解释见程序。

学完树的dfs序,lca,线段树食用更佳。

不会这些学什么树剖(逃~

  1. #include <bits/stdc++.h> //万能头文件
  2. using namespace std;
  3. int n,q,tot;
  4. int fa[100005],size[100005],dep[100005],son[100005];
  5. int lo[100005],top[100005];
  6. int sum[800005],tag[800005];
  7. vector <int> allson[100005];
  8. //线段树
  9. void pushup(int x)//更新
  10. {
  11. sum[x]=sum[x<<1]+sum[(x<<1)+1];
  12. }
  13. void pushdown(int x,int l,int r)//清除懒标记
  14. {
  15. if(tag[x]!=-1)
  16. {
  17. int m=(l+r)>>1;
  18. int ls=x<<1;
  19. int rs=ls+1;
  20. tag[ls]=tag[rs]=tag[x];
  21. sum[ls]=(m-l+1)*tag[x];
  22. sum[rs]=(r-m)*tag[x];
  23. tag[x]=-1;
  24. }
  25. }
  26. void update(int x,int l,int r,int L,int R,int v)//修改
  27. {
  28. if(R<l||r<L)
  29. return;
  30. if(L<=l&&r<=R)
  31. {
  32. sum[x]=(r-l+1)*v;
  33. tag[x]=v;
  34. return;
  35. }
  36. pushdown(x,l,r);
  37. int m=(l+r)>>1;
  38. update(x<<1,l,m,L,R,v);
  39. update((x<<1)+1,m+1,r,L,R,v);
  40. pushup(x);
  41. }
  42. //树链剖分
  43. void change(int x,int y,int v)//类似lca
  44. {
  45. int fx=top[x],fy=top[y];
  46. while(fx!=fy)
  47. {
  48. if(dep[fx]<dep[fy])
  49. swap(x,y),swap(fx,fy);
  50. update(1,1,tot,lo[fx],lo[x],v);
  51. x=fa[fx],fx=top[x];
  52. }
  53. if(lo[x]>lo[y])
  54. swap(x,y);
  55. update(1,1,tot,lo[x],lo[y],v);
  56. }
  57. void dfs1(int x)
  58. {
  59. size[x]=1;
  60. for(int i=0;i<allson[x].size();++i)
  61. {
  62. int v=allson[x][i];
  63. dep[v]=dep[x]+1;//深度
  64. dfs1(v);
  65. size[x]+=size[v];//子树大小
  66. if(size[v]>size[son[x]])
  67. son[x]=v;//重儿子
  68. }
  69. }
  70. void dfs2(int x,int t)
  71. {
  72. lo[x]=++tot;
  73. top[x]=t;//重链父亲
  74. if(son[x])
  75. dfs2(son[x],t);
  76. for(int i=0;i<allson[x].size();++i)
  77. {
  78. int v=allson[x][i];
  79. if(v!=son[x])
  80. dfs2(v,v);
  81. }
  82. }
  83. int main()
  84. {
  85. memset(tag,-1,sizeof(tag)); //lazy_tag为-1表示没有
  86. ios::sync_with_stdio(0);
  87. cin>>n;
  88. fa[1]=1;
  89. for(int i=2;i<=n;++i)
  90. {
  91. int x;
  92. cin>>x;
  93. fa[i]=x+1;
  94. allson[x+1].push_back(i);
  95. }
  96. //预处理
  97. dfs1(1);
  98. dfs2(1,1);
  99. cin>>q;
  100. while(q--)
  101. {
  102. string s;
  103. int x;
  104. cin>>s>>x;
  105. x++;
  106. int before=sum[1];//改之前
  107. if(s=="install")
  108. {
  109. change(1,x,1);//1到x路上全改成1
  110. int after=sum[1];//改后
  111. cout<<fabs(before-after)<<endl;
  112. }
  113. else
  114. {
  115. update(1,1,n,lo[x],lo[x]+size[x]-1,0);//把x的子树改成0
  116. int after=sum[1];//改后
  117. cout<<fabs(before-after)<<endl;
  118. }
  119. }
  120. return 0;
  121. }

【题解】Luogu P2146 [NOI2015]软件包管理器的更多相关文章

  1. 【luogu P2146 [NOI2015]软件包管理器】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2146 变量名真毒瘤 我真的再也不把l,left,r,right弄反了 反向思维更好做一些 #include ...

  2. Luogu P2146 [NOI2015]软件包管理器 树剖

    卸载:把子树清空: 安装:把自己到$1$的链改为$1$ #include<cstdio> #include<iostream> #include<cstring> ...

  3. 题解 P2146 [NOI2015]软件包管理器

    P2146 [NOI2015]软件包管理器 感觉代码比其他题解更简洁qwq 树链剖分模板题 install x:将1~x的路径上的节点全部变成1(安装x需要先安装1~x) uninstall x:将x ...

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

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

  5. [Luogu 2146] NOI2015 软件包管理器

    [Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...

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

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

  7. P2146 [NOI2015]软件包管理器

    题目链接:https://www.luogu.org/problemnew/show/P2146 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安 ...

  8. 洛谷 P2146 [NOI2015]软件包管理器 (树链剖分模板题)

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

  9. 【Luogu P2146】软件包管理器

    Luogu P2146 由于对于每一个软件包有且只有一个依赖的软件包,且依赖关系不存在环. 很显然这是一个树形的结构. 再看题目要求的操作,安装实际上对应的是覆盖根节点到当前节点的路径,卸载则是覆盖该 ...

随机推荐

  1. js图的数据结构处理---弗洛伊德算法

    function Graph() { this.graph = [ [0, 2, 4, 0, 0, 0], [0, 0, 1, 4, 2, 0], [0, 0, 0, 0, 3, 0], [0, 0, ...

  2. NPOI设置单元格格式

    转自:http://www.cr173.com/html/18143_2.html //创建一个常用的xls文件 private void button3_Click(object sender, E ...

  3. (已解决)Eclipse报错:Could not find XXX.apk. 没有Android项目命名. There is no android project named

    可能是你把当前项目设置为library项目了,按以下步骤切换回普通项目: 选择 Project->Properties 在左边的列表中,选择 Android 取消钩中"Is Libra ...

  4. 201803020001-多重MACD图.png

  5. jquery.ajax请求aspx和ashx的异同 Jquery Ajax调用aspx页面方法

    1.jquery.ajax请求aspx 请求aspx的静态方法要注意一下问题: (1)aspx的后台方法必须静态,而且添加webmethod特性 (2)在ajax方法中contentType必须是“a ...

  6. python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod

    python基础-abstractmethod.__属性.property.setter.deleter.classmethod.staticmethod

  7. mysql制造大量测试数据心得

    为了测试1000万条数据的查询性能,就需要1000万条数据,于是在我们做的项目的一个游客表的一条记录的基础上来制造. 1.使用mysql的while循环语句,比如手机号的循环,还有一些随机数,比如性别 ...

  8. [ Learning ] Design Pattens

    1. 单例2. 模板3. 代理,装饰 (代理和装饰的区别)4. 状态

  9. Python全栈-day12-day13-函数4

    1.迭代器 1)定义:迭代取值的工具 2)优缺点 优点 a.提供一种不依赖索引取值的方法 b.同时一时刻内存在存在的值只有一个,更加省内存 缺点 a.取值麻烦,只能通过next方法一个一个地往后取 b ...

  10. Linq To SQL LEFT OUTER JOIN (Left Join)

    SQL: SELECT [t0].[ProductName], [t1].[TotalPrice] AS [TotalPrice] FROM [Product] AS [t0] LEFT OUTER ...