传送门

题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点;强制在线


一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭

然后发现看错了这不一道树上分块水题...

用王室联邦分块的话需要维护每一个块$dfs$序最小值和最大值,并且插入操作会破坏原来的性质

不如直接按$size$分块,根节点$size<block$就加入根,否则新建块

$size$分块不能保证块的数量,可以被菊花图卡掉,然而本题没有所以就可以安心的写了

每个块维护排序后的值

查询操作,不完整的块(因为是$size$分块所以只有子树根所在块不完整)暴力,直接把块建一个图,每个整块二分

修改维护有序,插入也维护有序;当然修改和插入后重新排序也可以

复杂度 修改插入$O(S)$ 查询$O(S+\frac{N}{S}logS)$

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N=6e4+, M=1e4+, S=;
  9. inline int read(){
  10. char c=getchar();int x=,f=;
  11. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  12. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  13. return x*f;
  14. }
  15.  
  16. int n,Q,a[N],op,u,x;
  17. struct edge{int v,ne;} e[N<<];
  18. int cnt,h[N];
  19. inline void ins(int u,int v) {
  20. e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
  21. e[++cnt]=(edge){u,h[v]}; h[v]=cnt;
  22. }
  23.  
  24. struct meow{
  25. int a[S], size;
  26. inline void set() {sort(a+, a++size);}
  27. inline int count(int v) {return size - (upper_bound(a+, a++size, v) - a) + ;}
  28. inline void push(int v) {a[++size]=v;}
  29. inline void replace(int x,int v) {
  30. if(x==v) return;
  31. for(int i=;i<=size;i++) if(a[i]==x) {
  32. if(v>x) while(i<size && v>a[i+]) a[i]=a[i+], i++;
  33. else while(i> && v<a[i-]) a[i]=a[i-], i--;
  34. a[i]=v; break;
  35. }
  36. }
  37. inline void insert(int v){
  38. int i;
  39. for(i=; i<=size && a[i]<v; i++) ;
  40. for(int j=size; j>=i; j--) a[j+]=a[j];
  41. a[i]=v; size++;
  42. }
  43. }b[M];
  44. int m, pos[N], block;
  45.  
  46. struct Graph4Block{
  47. struct edge{int v,ne;} e[M];
  48. int cnt,h[M];
  49. inline void ins(int u,int v) {
  50. e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
  51. }
  52. int dfs(int u,int k) {
  53. int ans= b[u].count(k);
  54. for(int i=h[u];i;i=e[i].ne) ans+=dfs(e[i].v, k);
  55. return ans;
  56. }
  57. }G;
  58.  
  59. int fa[N];
  60. void dfs(int u) {
  61. int p=pos[u];
  62. b[p].push(a[u]);
  63. for(int i=h[u];i;i=e[i].ne)
  64. if(e[i].v!=fa[u]) {
  65. fa[e[i].v]=u;
  66. if(b[p].size < block) pos[e[i].v]=p;
  67. else pos[e[i].v]=++m, G.ins(p, m);
  68. dfs(e[i].v);
  69. }
  70. }
  71.  
  72. struct Block{
  73. int dfs(int u,int k) {
  74. int ans= a[u]>k;
  75. for(int i=h[u];i;i=e[i].ne)
  76. if(e[i].v!=fa[u]) {
  77. if(pos[e[i].v] == pos[u]) ans+= dfs(e[i].v, k);
  78. else ans+= G.dfs(pos[e[i].v], k);
  79. }
  80. return ans;
  81. }
  82. int Que(int u, int k) {return dfs(u, k);}
  83.  
  84. void Cha(int u, int d) {b[pos[u]].replace(a[u], d); a[u]=d;}
  85.  
  86. void Ins(int u, int d){
  87. a[++n]=d; ins(u, n); fa[n]=u;
  88. int p=pos[u];
  89. if(b[p].size < block) pos[n]=p, b[p].insert(a[n]);
  90. else pos[n]=++m, b[m].push(a[n]), G.ins(p, m);
  91. }
  92. }B;
  93. int main() {
  94. freopen("in", "r", stdin);
  95. n=read();
  96. for(int i=;i<n;i++) ins(read(), read() );
  97. for(int i=;i<=n;i++) a[i]=read();
  98. block=pow(n, 0.6);
  99. pos[]=++m; dfs();
  100. for(int i=;i<=m;i++) b[i].set();
  101.  
  102. Q=read(); int lastans=;
  103. for(int i=;i<=Q;i++) {
  104. op=read();
  105. u=read()^lastans; x=read()^lastans;
  106. if(op==) lastans=B.Que(u, x), printf("%d\n",lastans);
  107. else if(op==) B.Cha(u, x);
  108. else B.Ins(u, x);
  109. }
  110. }

BZOJ 3720: Gty的妹子树 [树上size分块]的更多相关文章

  1. [bzoj 3720] Gty的妹子树 (树上分块)

    树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...

  2. bzoj 3720: Gty的妹子树 块状树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 412  Solved: 153[Submit][Status] Descr ...

  3. BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]

    传送门 题意:一棵树,询问子树中权值大于k的节点个数,修改点权值,插入新点,断开边:强制在线 该死该死该死!!!!!! MD我想早睡觉你知不知道 该死该死沙比提 断开边只会影响一个块,重构这个块就行了 ...

  4. bzoj 3720 Gty的妹子树 树分块?瞎搞

    Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2149  Solved: 781[Submit][Status][Discuss] D ...

  5. BZOJ.3720.Gty的妹子树(树分块)

    题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...

  6. 【BZOJ3720】Gty的妹子树 块状树

    [BZOJ3720]Gty的妹子树 我曾在弦歌之中听过你,檀板声碎,半出折子戏.舞榭歌台被风吹去,岁月深处尚有余音一缕……Gty神(xian)犇(chong)从来不缺妹子……他来到了一棵妹子树下,发现 ...

  7. bzoj 3744: Gty的妹子序列 主席树+分块

    3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Descr ...

  8. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  9. BZOJ 3744 Gty的妹子序列

    Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...

随机推荐

  1. ACM_扩展欧几里德算法

    <pre name="code" class="cpp">/* 扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表 ...

  2. You can Solve a Geometry Problem too(线段求交)

    http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000 ...

  3. SQL语句整理1

    THEN '月卡' THEN '周卡' THEN '季度卡' THEN '年卡' ELSE '未知卡类型' END AS '卡类型' FROM SL_Register_Info Left join用法 ...

  4. Oracle_where子句

    Oracle_where子句 --1.查询员工名为'SMITH'的信息 select * from emp where ename = 'SMITH';   --2.查询在1980/12/17入职的员 ...

  5. WPF 简单的循环GIF播放

    //MVVM要事件绑定,记得项目引用类库“Sysrem.Windows.interactivity”,然后XAML引用 xmlns:i="http://schemas.microsoft.c ...

  6. dede从www跟目录迁移,网站空间

    图集缩略图表名dede_uploads                    字段url; 图集文章内部的图片表名dede_addonimages        字段imgurls 频道文章列表的图片 ...

  7. Block 的使用时机

    Block 一般是用来表示.简化一小段的程式码,它特别适合用来建立一些同步执行的程式片段.封装一些小型的工作或是用来做为某一个工作完成时的回传呼叫(callback) . 在新的iOS API中blo ...

  8. <c:forEach 的常用整理

    <c:forEach items="${images}" var="img" varStatus="status"> <d ...

  9. Oracle database

    //下面这个通常直选择TCP就好了 此处的全局数据库根据实际情况来确定,如果是第一次,要和第一次一致.(见上面的图中的全局数据库) //这个可以使  计算机名(计算机—>属性).也可以是ip地址 ...

  10. MySQL zip解压版安装过程及问题

    1.首先解压mysql压缩包,然后添加环境变量path(D:\mysql-5.7.11\bin) 2.修改D:\mysql-5.7.11\my-default.ini​ 文件的配置项 ​        ...