Description

给定一棵大小为 n 的有根点权树,支持以下操作: 
  • 换根 
  • 修改点权  
     • 查询子树最小值

Input

  第一行两个整数 n, Q ,分别表示树的大小和操作数。 
  接下来n行,每行两个整数f,v,第i+1行的两个数表示点i的父亲和点i的权。保证f < i。如 果f = 0,那么i为根。输入数据保证只有i = 1时,f = 0。 
  接下来 m 行,为以下格式中的一种: 
  • V x y表示把点x的权改为y 
  • E x 表示把有根树的根改为点 x 
  • Q x 表示查询点 x 的子树最小值

Output

  对于每个 Q ,输出子树最小值。

Sample Input

3 7
0 1
1 2
1 3
Q 1
V 1 6
Q 1
V 2 5
Q 1
V 3 4
Q 1

Sample Output

1
2
3
4

HINT

  对于 100% 的数据:n, Q ≤ 10^5。

题解:

  蛮裸的一道题(但我线段树打错,一路狂wa……)

  跑dfs序,用线段树维护dfs序区间最值。对于x与root的关系:

1.x==root ,全局最小

2.x为root祖先节点,找到x的某个包含root的儿子,查询除去这个儿子以为的全局最值

3.其他情况下,直接查询x子树最值。

代码:

  1. #include<cstdio>
  2. inline int min(int a,int b){return a<b?a:b;}
  3. const int N=(int )1e5+;
  4. inline int read(){
  5. int s=,k=;char ch=getchar();
  6. while(ch<''||ch>'') k=ch=='-'?-:k,ch=getchar();
  7. while(ch>&&ch<='') s=s*+(ch^),ch=getchar();
  8. return s*k;
  9. }
  10. int n,Q;
  11. struct edges{
  12. int v;edges *last;
  13. }edge[N],*head[N];int cnt;
  14. inline void push(int u,int v){
  15. edge[++cnt]=(edges){v,head[u]};head[u]=edge+cnt;
  16. }
  17. struct Tree{
  18. int val;Tree *son[];
  19. Tree(){
  20. son[]=son[]=NULL;
  21. }
  22. }tree[N<<],*root;
  23. int val[N];
  24. int rt;
  25. int f[][N],deep[N];
  26. int l[N],r[N],re[N];
  27. int num;
  28. inline void dfs(int x){
  29. l[x]=++num;
  30. re[num]=x;
  31. for(int i=;(<<i)<=deep[x];i++)
  32. f[i][x]=f[i-][f[i-][x]];
  33. for(edges *i=head[x];i;i=i->last){
  34. deep[i->v]=deep[x]+;
  35. f[][i->v]=x;
  36. dfs(i->v);
  37. }
  38. r[x]=num;
  39. }
  40. inline int LCA(int x,int y){
  41. if(deep[x]<deep[y]) x^=y^=x^=y;
  42. int t=deep[x]-deep[y];
  43. for(int i=;t;i++) if(t&(<<i)){
  44. t^=(<<i);
  45. x=f[i][x];
  46. }
  47. if(x==y) return x;
  48. for(int i=;i>=;i--){
  49. if(f[i][x]!=f[i][y])
  50. x=f[i][x],y=f[i][y];
  51. }return f[][x];
  52. }
  53. inline void build(Tree *&u,int l,int r){
  54. u=tree+cnt;
  55. cnt++;
  56. if(l==r){
  57. u->val=val[re[l]];return ;
  58. }
  59. int mid=l+r>>;
  60. build(u->son[],l,mid);
  61. build(u->son[],mid+,r);
  62. u->val=min(u->son[]->val,u->son[]->val);
  63. //printf("l=%d r=%d val=%d son[0]=%d son[1]=%d\n",l,r,u->val,u->son[0]->val,u->son[1]->val);
  64. }
  65.  
  66. inline void add(Tree *u,int l,int r,int x,int w){
  67. if(l==r){
  68. u->val=w;return ;
  69. }
  70. int mid=l+r>>;
  71. if(x>mid) add(u->son[],mid+,r,x,w);
  72. else add(u->son[],l,mid,x,w);
  73. u->val=min(u->son[]->val,u->son[]->val);
  74. }
  75.  
  76. inline int query(Tree *u,int l,int r,int x,int y){
  77. if(x>y) return 0x7fffffff;
  78. if(x<=l&&r<=y){
  79. return u->val;
  80. }
  81. int mid=l+r>>;
  82. if(x>mid) return query(u->son[],mid+,r,x,y);
  83. else if(y<=mid) return query(u->son[],l,mid,x,y);
  84. return min(query(u->son[],l,mid,x,y),query(u->son[],mid+,r,x,y));
  85. }
  86. int main(){
  87. n=read(),Q=read();
  88. for(int i=;i<=n;i++){
  89. int x=read();
  90. if(x==) rt=i;
  91. val[i]=read();push(x,i);
  92. }
  93. dfs(rt);
  94. cnt=;
  95. build(root,,n);
  96. char op[];
  97. while(Q--){
  98. scanf("%s",op);
  99. if(op[]=='V'){
  100. int x=read(),y=read();
  101. add(root,,n,l[x],y);
  102. }else if(op[]=='E'){
  103. int x=read();
  104. rt=x;
  105. }else{
  106. int x=read();
  107. if(rt==x){
  108. printf("%d\n",root->val);
  109. continue;
  110. }
  111. if(l[x]<=l[rt]&&r[x]>=r[rt]){
  112. int y=rt;
  113. int t=deep[rt]-deep[x]-;
  114. for(int i=;t;i++)if(t&(<<i)){
  115. t^=<<i;
  116. y=f[i][y];
  117. }
  118. printf("%d\n",min(query(root,,n,,l[y]-),query(root,,n,r[y]+,n)));
  119. }else{
  120. printf("%d\n",query(root,,n,l[x],r[x]));
  121. }
  122. }
  123. }
  124. }
  125. /*
  126. 3 7
  127. 0 1
  128. 1 2
  129. 1 3
  130. Q 1
  131. V 1 6
  132. Q 1
  133. V 2 5
  134. Q 1
  135. V 3 4
  136. Q 1
  137. */

【bzoj 3306】树的更多相关文章

  1. BZOJ 3306 树

    dfs序建线段树+分类讨论+写的有点长. #include<iostream> #include<cstdio> #include<cstring> #includ ...

  2. BZOJ 3306: 树 LCT + set 维护子树信息

    可以作为 LCT 维护子树信息的模板,写的还是比较优美的. 本地可过,bzoj 时限太紧,一直 TLE #include<bits/stdc++.h> #define setIO(s) f ...

  3. bzoj 3306

    以1号节点为根,弄出DFS序,我们发现,对于一个询问:(rt,u),以rt为根,u节点的子树中的最小点权,我们可以根据rt,u,1这三个节点在同一条路径上的相对关系来把它转化为以1为根的在DFS序上的 ...

  4. bzoj 3196 树套树模板

    然而我还是在继续刷水题... 终于解开了区间第k大的心结... 比较裸的线段树套平衡树,比较不好想的是求区间第k大时需要二分一下答案,然后问题就转化为了第一个操作.复杂度nlog3n.跑的比较慢... ...

  5. BZOJ 1969 树链剖分+Tarjan缩点

    发现自己Tarjan的板子有错误.发现可以用Map直接删去边,Get. 听说std是双连通.LCA.并查集.离线思想.用BIT维护dfs序和并查集维护LCA的动态缩点的好题 #include < ...

  6. BZOJ 2286 树链剖分+DFS序+虚树+树形DP

    第一次学习虚树,就是把无关的点去掉.S里维护一条链即可. #include <iostream> #include <cstring> #include <cstdio& ...

  7. BZOJ 4326 树链剖分+二分+差分+记忆化

    去年NOIP的时候我还不会树链剖分! 还是被UOJ 的数据卡了一组. 差分的思想还是很神啊! #include <iostream> #include <cstring> #i ...

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

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

  9. BZOJ 2282 & 树的直径

    SDOI2011的Dayx第2题 题意: 在树中找到一条权值和不超过S的链(为什么是链呢,因为题目中提到“使得路径的两端都是城市”,如果不是链那不就不止两端了吗——怎么这么机智的感觉...),使得不在 ...

随机推荐

  1. mybatis自我总结

    mybatis是一款优秀的持久层框架,它避免了JDBC代码.将SQL语句放在Java中以及结果集的处理.利于后期的维护.它将SQL语句放到XML文件中. mybatis有sqlsessionfacto ...

  2. nvm使用笔记

    1.先发个中文博客的链接:http://www.cnblogs.com/kaiye/p/4937191.html 2.安装node版本的命令问题,版本号前面要加v,安装6.9.1的正确命令是: nvm ...

  3. 导入项目 idea

    下的java核心编程的源码,只有java文件,没有idea或者eclipse的项目结构信息. 分别用eclipse和idea打开了一遍,方便学习调试. 项目文件夹:E:\学习资料\Java\语法\ja ...

  4. Ocelot中文文档-Websockets

    Ocelot额外支持代理websockets.这个功能在问题 212中被提出. 为了是Ocelot代理websocket,你需要做如下事情. 在你的Configure方法中,你要告知应用程序使用Web ...

  5. ES6浅谈之Promise

    首先来回想一下Promise对象的写法: // 方法1 let promise = new Promise ( (resolve, reject) => { if ( success ) { . ...

  6. 第三方支付设计——账户体系

    第三方支付架构设计之-帐户体系 一,      什么是第三方支付?         什么是第三方支付?相信很多人对这个名字很熟悉,不管是从各种媒体等都经常听到,可以说是耳熟能熟.但,如果非得给这个名词 ...

  7. Django+xadmin打造在线教育平台(五)

    目录 在线教育平台(一)      在线教育平台(二) 在线教育平台(三)      在线教育平台(四) 在线教育平台(五)      在线教育平台(六) 在线教育平台(七)      在线教育平台( ...

  8. Tomcat PermGen space的解决方案

    Tomcat报告 Caused by: java.lang.OutOfMemoryError: PermGen space异常 内存溢出PermGen space的全称是Permanent Gener ...

  9. ubuntu16+zabbix3.4+grafana环境搭建记录

    最近研究了zabbix,稍后放上环境搭建教程,建议想学习搭建的同学记得参考zabbix官网

  10. 利用box-shadow属性实现页面层叠效果

    效果图如下 box-shadow的语法 代码展示 .footer { color: #777; padding: 10px 15px; height: 20px; text-align: center ...