【SYZOJ279】滑稽♂树(树套树)

题面

SYZOJ

CJOJ

题目描述

zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到。虽然我们看不到,但是还是知道一些信息:

这真的是一棵树,由n个节点,n-1条边联通。一号滑稽果同时也是整棵滑稽树的树根。

滑稽树上每个节点有一个滑稽果,每个滑稽果有它的重量。

雪甜甜公主是神犇当然看得到那棵滑稽树啦,现在她感兴趣的是这样三件事

1:滑稽树太大啦,雪甜甜公主有的时候只想知道,在以某一个滑稽果为根的子滑稽树里面,重量第k小的果子的重量是多少?

2:除了重量第k小的果子,雪甜甜还想知道以某个滑稽果为根的子滑稽树里面,重量在[a, b]这个范围内的滑稽果有多少个。

3:雪甜甜还喜欢吃滑稽果,但是吃完,原来滑稽果的位置上还会长出一个新的滑稽果,只是重量可能不一样。

输入格式

第一行一个正整数n,表示滑稽树有n个节点。

第二行n个正整数,分别描述1号,2号,,,,n号节点滑稽果的重量。

接下来n-1行,每行2个正整数u, v ∈ [1, n],表示滑稽果u与滑稽果v之间有树枝连接。

接下来一个正整数q,表示雪甜甜有q次行动

之后q行,有这样3种形式

1 u k 雪甜甜公主询问以u为根的子滑稽树中,重量第k小的滑稽果的重量。

2 u a b 雪甜甜公主想知道,以u为根的子滑稽树中,重量在[a, b]范围内的滑稽果有多少个。

3 u x 雪甜甜公主吃掉了编号为u的滑稽果,但是在原位置上立刻长出来了一个重量为x的滑稽果。因为位置没有变,所以编号还是u。

输出格式

对于每次询问,输出结果。

样例

input

5

3 4 6 1 2

1 2

1 3

3 4

3 5

7

1 1 4

2 1 1 5

3 4 5

1 1 4

2 3 3 6

3 5 7

1 3 3

output

4

4

5

2

7

题解

树套树大裸题

直接来一个带修改主席树就没了

真简单

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. #define MAX 55555
  15. inline int read()
  16. {
  17. RG int x=0,t=1;RG char ch=getchar();
  18. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  19. if(ch=='-')t=-1,ch=getchar();
  20. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  21. return x*t;
  22. }
  23. int n,W[MAX];
  24. struct Line{int v,next;}e[MAX<<1];
  25. int h[MAX],cnt=1;
  26. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
  27. int dfn[MAX],low[MAX],tim;
  28. void dfs(int u,int ff)
  29. {
  30. dfn[u]=++tim;
  31. for(int i=h[u];i;i=e[i].next)
  32. if(e[i].v!=ff)dfs(e[i].v,u);
  33. low[u]=tim;
  34. }
  35. int rt[MAX],tot;
  36. struct Node{int ls,rs,v;}t[MAX<<7];
  37. int lb(int x){return x&(-x);}
  38. void Modify(int &x,int ff,int l,int r,int p,int w)
  39. {
  40. x=++tot;t[x]=t[ff];t[x].v+=w;
  41. if(l==r)return;
  42. int mid=(l+r)>>1;
  43. if(p<=mid)Modify(t[x].ls,t[ff].ls,l,mid,p,w);
  44. else Modify(t[x].rs,t[ff].rs,mid+1,r,p,w);
  45. }
  46. void preModify(int x,int p,int w)
  47. {
  48. for(int i=x;i<=n;i+=lb(i))
  49. Modify(rt[i],rt[i],1,10000,p,w);
  50. }
  51. int tmp1[MAX],tmp2[MAX],t1,t2;
  52. void preQuery(int l,int r)
  53. {
  54. t1=t2=0;
  55. for(int i=l;i;i-=lb(i))tmp1[++t1]=rt[i];
  56. for(int i=r;i;i-=lb(i))tmp2[++t2]=rt[i];
  57. }
  58. int Query(int l,int r,int K)
  59. {
  60. if(l==r)return l;
  61. int s=0,mid=(l+r)>>1;
  62. for(int i=1;i<=t1;++i)s-=t[t[tmp1[i]].ls].v;
  63. for(int i=1;i<=t2;++i)s+=t[t[tmp2[i]].ls].v;
  64. if(s>=K)
  65. {
  66. for(int i=1;i<=t1;++i)tmp1[i]=t[tmp1[i]].ls;
  67. for(int i=1;i<=t2;++i)tmp2[i]=t[tmp2[i]].ls;
  68. return Query(l,mid,K);
  69. }
  70. else
  71. {
  72. for(int i=1;i<=t1;++i)tmp1[i]=t[tmp1[i]].rs;
  73. for(int i=1;i<=t2;++i)tmp2[i]=t[tmp2[i]].rs;
  74. return Query(mid+1,r,K-s);
  75. }
  76. }
  77. int QuerySum(int l,int r,int L,int R)
  78. {
  79. int ret=0;
  80. if(L<=l&&r<=R)
  81. {
  82. for(int i=1;i<=t1;++i)ret-=t[tmp1[i]].v;
  83. for(int i=1;i<=t2;++i)ret+=t[tmp2[i]].v;
  84. return ret;
  85. }
  86. int mid=(l+r)>>1;
  87. if(L<=mid)
  88. {
  89. int T1[MAX],T2[MAX];
  90. for(int i=1;i<=t1;++i)T1[i]=tmp1[i],tmp1[i]=t[tmp1[i]].ls;
  91. for(int i=1;i<=t2;++i)T2[i]=tmp2[i],tmp2[i]=t[tmp2[i]].ls;
  92. ret+=QuerySum(l,mid,L,R);
  93. for(int i=1;i<=t1;++i)tmp1[i]=T1[i];
  94. for(int i=1;i<=t2;++i)tmp2[i]=T2[i];
  95. }
  96. if(R>mid)
  97. {
  98. int T1[MAX],T2[MAX];
  99. for(int i=1;i<=t1;++i)T1[i]=tmp1[i],tmp1[i]=t[tmp1[i]].rs;
  100. for(int i=1;i<=t2;++i)T2[i]=tmp2[i],tmp2[i]=t[tmp2[i]].rs;
  101. ret+=QuerySum(mid+1,r,L,R);
  102. for(int i=1;i<=t1;++i)tmp1[i]=T1[i];
  103. for(int i=1;i<=t2;++i)tmp2[i]=T2[i];
  104. }
  105. return ret;
  106. }
  107. int main()
  108. {
  109. n=read();
  110. for(int i=1;i<=n;++i)W[i]=read();
  111. for(int i=1;i<n;++i)
  112. {
  113. int u=read(),v=read();
  114. Add(u,v);Add(v,u);
  115. }
  116. dfs(1,0);
  117. for(int i=1;i<=n;++i)
  118. preModify(dfn[i],W[i],1);
  119. int Q=read();
  120. while(Q--)
  121. {
  122. int opt=read(),u=read();
  123. if(opt==1)
  124. {
  125. preQuery(dfn[u]-1,low[u]);
  126. printf("%d\n",Query(1,10000,read()));
  127. }
  128. if(opt==2)
  129. {
  130. int l=read(),r=read();
  131. preQuery(dfn[u]-1,low[u]);
  132. printf("%d\n",QuerySum(1,10000,l,r));
  133. }
  134. if(opt==3)
  135. {
  136. preModify(dfn[u],W[u],-1);
  137. W[u]=read();
  138. preModify(dfn[u],W[u],1);
  139. }
  140. }
  141. return 0;
  142. }

【SYZOJ279】滑稽♂树(树套树)的更多相关文章

  1. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  2. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  3. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  4. bzoj3262: 陌上花开(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  7. BZOJ 3110 树套树 && 永久化标记

    感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...

  8. 【BZOJ-1452】Count 树状数组 套 树状数组

    1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1769  Solved: 1059[Submit][Stat ...

  9. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

随机推荐

  1. dotnet core 开发中遇到的问题

    1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...

  2. Spring学习(十)-----Spring依赖检查

    在Spring中,可以使用依赖检查功能,以确保所要求的属性可设置或者注入. 依赖检查模式 4个依赖检查支持的模式: none – 没有依赖检查,这是默认的模式. simple – 如果基本类型(int ...

  3. 二、利用EnterpriseFrameWork快速开发Web系统(B/S)

    EnterpriseFrameWork框架实例源代码下载: 实例下载 本章通过一个开发实例来讲解Web系统的开发经过,以及会碰到的一些问题.实例功能就是业务系统中最常见的增.删.改.查来演示,用一个界 ...

  4. 【转】PHPCMS+PHPExcel实现后台数据导入导出功能

    首先,上图之中的红色框框是没有的,我们想要给他加上,当然是要改HTML页面啦,废话,我们跟ECSHOP一样由PHP路径找模板: 看看路由原理: 首先,上图之中的红色框框是没有的,我们想要给他加上,当然 ...

  5. Prometheus+Grafana监控部署实践

    参考文档: Prometheus github:https://github.com/prometheus grafana github:https://github.com/grafana/graf ...

  6. VPS挂机赚美刀详细介绍–Alexamaster操作流程

    跟 vps 主机打交道时间长了,手里也渐渐积累了些闲置的 vps.让它们这么闲着吧,感觉有些浪费资源:用起来吧,暂时又没有好的项目.一直听说通过 vps挂机可以赚回主机成本,甚至可以盈利.正好这两天有 ...

  7. PytorchZerotoAll学习笔记(五)--逻辑回归

    逻辑回归: 本章内容主要讲述简单的逻辑回归:这个可以归纳为二分类的问题. 逻辑,非假即真.两种可能,我们可以联想一下在继电器控制的电信号(0 or 1) 举个栗子:比如说你花了好几个星期复习的考试(通 ...

  8. mac 安装配置使用nexus3.x

    一.nexus安装 前置条件 :已经安装了JDK 1:下载nexus(http://www.sonatype.com/download-oss-sonatype) 最新版本3.0,下载目录为/User ...

  9. linux-ubuntu配置通过22端口远程连接

    当安装好ubuntu后获取到对应主机的ip地址,要想通过类似xshell这样的远程连接工具连接到ubuntu主机,需要在你刚刚安装好的ubuntu主机上安装openssh这个软件,才能通过远程来连接u ...

  10. Beta发布—美工+文案

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2408 视频展示地址:https://www.bilibili.com/v ...