#\(\mathcal{\color{red}{Description}}\)

\(Link\)

一道\(zz\)的树剖题\(qwq\)。

#\(\mathcal{\color{red}{Solution}}\)

我天\(NOI\)怎么可能有这种水题啊……

很显然的就是 线段树区间染色 + 统计根到每个节点的距离 + 子树和 + 修改子树 ……

纯纯的板子啊!

\(emmmmm\)于是这道题就完了~

  1. #include <cstdio>
  2. #include <vector>
  3. #include <iostream>
  4. #define il inline
  5. #define MAXN 200010
  6. #define ls(x) (x << 1)
  7. #define rs(x) (x << 1 | 1)
  8. #define mid ((l + r) >> 1)
  9. using namespace std ;
  10. char in[30] ;
  11. vector <int> sons[MAXN] ; int Id[MAXN], tot ;
  12. int dis[MAXN << 1], s[MAXN << 1], tag[MAXN << 1], i ;
  13. int N, M, In, fa[MAXN], dep[MAXN], Top[MAXN], sub[MAXN], hs[MAXN] ;
  14. inline int qrr(){
  15. int k = 0 ; char c = getchar() ;
  16. while (c < '0' || c > '9') c = getchar() ;
  17. while (c <= '9' && c >= '0') k = (k << 1) + (k << 3) + c - 48, c = getchar() ;
  18. return k ;
  19. }
  20. void _dfs1(int deep, int now, int f){
  21. dep[now] = deep, fa[now] = f ; sub[now] = 1 ;
  22. int _hs = -1 ;
  23. for (int k = 0 ; k < sons[now].size() ; ++ k){
  24. _dfs1(deep + 1, sons[now][k], now) ;
  25. sub[now] += sub[sons[now][k]] ;
  26. if(sub[sons[now][k]] > _hs)
  27. _hs = sub[sons[now][k]], hs[now] = sons[now][k] ;
  28. }
  29. }
  30. void _dfs2(int now, int Tp){
  31. Top[now] = Tp, Id[now] = ++ tot ;
  32. if (!hs[now]) return ;
  33. _dfs2(hs[now], Tp) ;
  34. for (int k = 0 ; k < sons[now].size() ; ++ k){
  35. if (sons[now][k] == hs[now]) continue ;
  36. _dfs2(sons[now][k], sons[now][k]) ;
  37. }
  38. }
  39. void build(int rt, int l, int r){
  40. if (l == r) {dis[rt] = 1 ; return ;}
  41. build(ls(rt), l, mid) ;
  42. build(rs(rt), mid + 1, r) ;
  43. dis[rt] = dis[ls(rt)] + dis[rs(rt)] ;
  44. }
  45. il void p_d(int rt, int l, int r){
  46. if(tag[rt] != -1){
  47. s[ls(rt)] = (mid - l + 1) * tag[rt] ;
  48. s[rs(rt)] = (r - mid) * tag[rt] ;
  49. tag[ls(rt)] = tag[rs(rt)] = tag[rt] ;
  50. tag[rt] = -1 ;
  51. }
  52. }
  53. int query_D(int rt, int l, int r, int ql, int qr){
  54. int res = 0 ;
  55. if (ql <= l && r <= qr){res += dis[rt] ; return res ;}
  56. if (ql <= mid) res += query_D(ls(rt), l, mid, ql, qr) ;
  57. if (qr > mid) res += query_D(rs(rt), mid + 1, r, ql, qr) ;
  58. return res ;
  59. }
  60. int query_C(int rt, int l, int r, int ql, int qr){
  61. int res = 0 ;
  62. if (ql <= l && r <= qr){res += s[rt] ; return res ;}
  63. p_d(rt, l, r) ;
  64. if (ql <= mid) res += query_C(ls(rt), l, mid, ql, qr) ;
  65. if (qr > mid) res += query_C(rs(rt), mid + 1, r, ql, qr) ;
  66. return res ;
  67. }
  68. void update_C(int rt, int l, int r, int ul, int ur, int k){
  69. if (ul <= l && r <= ur){
  70. s[rt] = (r - l + 1) * k ;
  71. tag[rt] = k ;
  72. return ;
  73. }
  74. p_d(rt, l, r) ;
  75. if (ul <= mid) update_C(ls(rt), l, mid, ul, ur, k) ;
  76. if (ur > mid) update_C(rs(rt), mid + 1, r, ul, ur, k) ;
  77. s[rt] = s[rs(rt)] + s[ls(rt)] ;
  78. }
  79. inline void qv(int now){
  80. int ans = 0, dif = 0 ;
  81. while (Top[now] != Top[1]){
  82. ans += query_D(1, 1, N, Id[Top[now]], Id[now]) ;
  83. dif += query_C(1, 1, N, Id[Top[now]], Id[now]) ;
  84. now = fa[Top[now]] ;
  85. }
  86. ans += query_D(1, 1, N, 1, Id[now]) ;
  87. dif += query_C(1, 1, N, 1, Id[now]) ;
  88. printf("%d\n", ans - dif) ;
  89. }
  90. inline void uv(int now){
  91. while (Top[now] != Top[1]){
  92. update_C(1, 1, N, Id[Top[now]], Id[now], 1) ;
  93. now = fa[Top[now]] ;
  94. }
  95. update_C(1, 1, N, 1, Id[now], 1) ;
  96. }
  97. int main(){
  98. //freopen("manager.in", "r", stdin) ;
  99. //freopen("manager.out", "w", stdout) ;
  100. N = qrr() ;
  101. fill (tag + 1, tag + (MAXN << 1) + 1, -1) ;
  102. for (i = 2; i <= N ;i ++){
  103. fa[i] = qrr() + 1,
  104. sons[fa[i]].push_back(i) ;
  105. } M = qrr() ;
  106. _dfs1(1, 1, 0), _dfs2(1, 1), build(1, 1, N) ;
  107. for (i = 1; i <= M ; i ++){
  108. scanf("%s", in) ;
  109. if (in[0] == 'u'){
  110. In = qrr() + 1 ;
  111. printf("%d\n", query_C(1, 1, N, Id[In], Id[In] + sub[In] - 1)) ;
  112. update_C(1, 1, N, Id[In], Id[In]+ sub[In] - 1, 0) ;
  113. continue ;
  114. }
  115. In = qrr() + 1 ;
  116. qv(In), uv(In) ;
  117. }
  118. }

番外:以下是三次评测:

最快的是\(qread + printf + O2\),其次是\(qread + printf\),最慢的是\(qread + cout\)……

[题解向] Luogu2146[NOI2015]软件包管理器的更多相关文章

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

    题目大意 ​ 给你一棵树, 求一点到根的路径上有多少个未标记点并全标记, 和询问一个点的子树内有多少已标记点和撤销标记 解题方法 1: install 操作 ​ 这个操作是求一点到根的路径上有多少个未 ...

  2. luogu2146 [NOI2015]软件包管理器

    安装就把根节点到它全设为 1 删除就把以它为根的子树全设为 0 记得标记初始化为-1,因为标记是 0 的情况也是要处理的. #include <iostream> #include < ...

  3. 【题解】NOI2015软件包管理器

    [题解][P2146 NOI2015]软件包管理器 实际上就是树链剖分板子题. 对于\(install\)操作,直接查询它到\(0\)节点有多少已经安装了的,再用总数减去它. 对于\(uninstal ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. HTML+CSS综合练习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 在excel实现多级联动

    最近做了一个Excel的多级联动的功能,具体是将全国所有的气象局按一二三四级单位做成四列,实现各级的联动下拉选择,这和省市县乡的各级联动的功能基本一样,下面记录下具体的操作步骤. 1.首先需要从数据库 ...

  3. logback配置和使用

    简介 logback是由log4j创始人设计的又一个开源日志组件.当前分成三个模块: logback-core是其它两个模块的基础模块. logback-classic是log4j的一个 改良版本.此 ...

  4. CSS 初识

    一.CSS 发展历程 从HTML被发明开始,样式就以各种形式存在.不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制.最初的HTML只包含很少的显示属性. 随着HTML的成长,为了满足页面设计 ...

  5. android中fragment卡顿的原因

    首页的ViewPager有十几个Fragment,在快速切换的时候,容易产生卡顿现象. 二.分析当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快 ...

  6. Android中自定义环形图2

    如图: 自定义属性,在values文件夹下创建 attrs.xml <?xml version="1.0" encoding="utf-8"?> & ...

  7. openssl生成证书及签名

    第一步,生成私钥 $ openssl genrsa -out privatekey.pem 2048 查看生成的私钥内容 $ file privatekey.pem privatekey.pem: P ...

  8. WIN10分盘

    https://jingyan.baidu.com/article/73c3ce28325dcde50243d94d.html

  9. golang之数据转换

    golang按位取反符号和异或符号都是^. fmt.Printf("0x%X\n", 0xFF^0x55) var a uint8 = 0x55 fmt.Printf(" ...

  10. .DS_Store文件是什么?Mac系统如何彻底清除该文件?

    用过Mac OS系统的都会注意到一个名为.DS_Store的隐藏文件,尤其是zip格式的压缩包解压的出来,会出现在各种文件夹内,非常烦人! 特别是把文件分享给使用windows的朋友的时候,这些文件会 ...