用 set 维护子树信息,细节较多。

Code:

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
#define setIO(s) freopen(s".in","r",stdin), freopen(s".out","w",stdout)
#define maxn 100009
#define inf -2147483647
using namespace std;
int fat[maxn];
int n,m;
struct Graph{int head[maxn],to[maxn<<1],nex[maxn<<1],cnt;    void addedge(int u,int v){ nex[++cnt]=head[u],head[u]=cnt,to[cnt]=v; }  void dfs(int u,int father){fat[u]=father;for(int v=head[u];v;v=nex[v]) if(to[v]!=father) dfs(to[v],u);}void Build(){for(int i=1;i<n;++i){int a,b;scanf("%d%d",&a,&b), addedge(a,b),addedge(b,a); }dfs(1,0);}
}G;
int col[maxn],v[maxn];
struct LCT{multiset<int>s[maxn]; multiset<int>::reverse_iterator rit;int ch[maxn][2],f[maxn];int siz[maxn],mx[maxn]; void init(){ mx[0]=-2147483647; } int value(int x) { rit=s[x].rbegin(); return (*rit);  }int get(int x){ return ch[f[x]][1]==x; }int lson(int x){ return ch[x][0];}int rson(int x){ return ch[x][1];}int isRoot(int x){ return !(ch[f[x]][0]==x||ch[f[x]][1]==x); }void pushup(int x){ if(!x) return; mx[x]=max(v[x],max(mx[lson(x)],mx[rson(x)])); if(!s[x].empty()) mx[x]=max(mx[x],value(x)); }void rotate(int x){int old=f[x],oldf=f[old],which=get(x);if(!isRoot(old)) ch[oldf][ch[oldf][1]==old]=x; ch[old][which]=ch[x][which^1],f[ch[old][which]]=old;ch[x][which^1]=old,f[old]=x,f[x]=oldf;pushup(old),pushup(x);}void splay(int x){int u=x;while(!isRoot(u)) u=f[u];u=f[u];for(int fa;(fa=f[x])!=u;rotate(x)) if(f[fa]!=u) rotate(get(fa)==get(x)?fa:x);}void Access(int x){for(int y=0;x;y=x,x=f[x]){splay(x);if(rson(x)) s[x].insert(mx[rson(x)]);  if(ch[x][1]=y) s[x].erase(s[x].find(mx[y])) ;  pushup(x);}}void cut(int a,int b){        if(!a) return; Access(b),splay(b),ch[b][0]=f[ch[b][0]]=0,pushup(b);}void link(int a,int b){                    if(!a) return; Access(a),splay(a),Access(b),splay(b);f[b]=a,ch[a][1]=b,pushup(a);}int findRoot(int a){Access(a),splay(a);while(ch[a][0]) a=ch[a][0];return a;}
}tree[2];
int main(){//setIO("debug");scanf("%d",&n),G.Build(),tree[0].init(),tree[1].init();for(int i=1;i<=n;++i) scanf("%d",&col[i]); for(int i=1;i<=n;++i) scanf("%d",&v[i]); fat[1]=n+1,v[n+1]=tree[1].mx[n+1]=tree[0].mx[n+1]=inf; for(int i=1;i<=n;++i) tree[col[i]].link(fat[i],i);     int opt,a;scanf("%d",&m);for(int i=1;i<=m;++i){scanf("%d%d",&opt,&a);if(opt==0) {int x=tree[col[a]].findRoot(a);tree[col[a]].splay(x); if(col[x]==col[a]) printf("%d\n",tree[col[a]].mx[x]);else printf("%d\n",tree[col[a]].mx[tree[col[a]].ch[x][1]]); }if(opt==1) {tree[col[a]].cut(fat[a],a),col[a]^=1,tree[col[a]].link(fat[a],a);}if(opt==2){tree[col[a]].Access(a),tree[col[a]].splay(a);scanf("%d",&v[a]); tree[col[a]].pushup(a); } }return 0;
}

  

转载于:https://www.cnblogs.com/guangheli/p/10159842.html

BZOJ 3639: Query on a tree VII LCT_set维护子树信息相关推荐

  1. bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了-- O( nlog ...

  2. bzoj 4530 [Bjoi2014]大融合——LCT维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530 LCT维护子树 siz .设 sm[ ] 表示轻儿子的 siz 和+1(1是自己的si ...

  3. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  4. BZOJ 4530 大融合 LCT维护子树信息

    题意: N<=1e5个点,Q<=1e5个操作. 支持加一条边(u,v)(保证图是森林).询问经过边(u,v)的简单路径条数(保证(u,v)存在). 分析: 数据结构学傻了的我,表示并不会用 ...

  5. [SPOJ16549 QTREE6 - Query on a tree VI]

    洛谷传送门 BZOJ传送门 题目描述(翻译) 给你一棵n个点的树,编号 1 1 1至n" role="presentation" style="position ...

  6. SPOJ 375. Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 375. Query on a tree Problem code: QTREE You are given a t ...

  7. XXI Open Cup. Grand Prix of Korea I. Query On A Tree 17 树剖 + 二分 + 树带权重心

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,每棵树初始权值都为000,现在给你两个操作: (1)(1)(1)将uuu的子树权值全部加111. (2)(2)(2)将(u,v)(u,v)(u,v ...

  8. [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

    首先,我们求出树的重链,然后对于每一条链,建一颗线段树 树大概长这样: (其中用红边连起来的是一条条重链) 在线段树上,我们维护: Opt(u):经过 u节点代表的链的其中一段 的两个白点间的最长路径 ...

  9. LCA SP913 QTREE2 - Query on a tree II

    SP913 QTREE2 - Query on a tree II 给定一棵n个点的树,边具有边权.要求作以下操作: DIST a b 询问点a至点b路径上的边权之和 KTH a b k 询问点a至点 ...

最新文章

  1. mysql远程主机强迫关闭了一个现有连接_asp.net连接mysql出现了远程主机强迫关闭了一个现有的连接。!!!...
  2. windows安装Matplotlib
  3. c++ 11 list转set
  4. SQL-92标准 中文翻译——定义、记号和约定 (定义)
  5. python文本去重函数_python3.4.3下逐行读入txt文本并去重的方法
  6. 计算机中常用术语CAD是指,计算机基础知识理论复习题及答案
  7. 用Keras搭建神经网络 简单模版(三)—— CNN 卷积神经网络(手写数字图片识别)...
  8. ngx lua API介绍
  9. python动态属性_Python进阶之@property动态属性的实现
  10. mysql padding_解决RGB模式下图片的padding(补边框)问题(含代码实现)
  11. Loadrunner 11检查点使用方法总结
  12. React 详解,组件,条件渲染
  13. 使用selenium爬取东航余票
  14. 第12届蓝桥杯 第七题:《砝码称重》的两种解法dfs和dp算法
  15. 【20保研】南开大学统计与数据科学学院2019年全国优秀大学生夏令营
  16. Epoch Based Reclamation 的个人理解
  17. 小波图像处理 —— 奇异点(不连续点)检测
  18. 矩阵特征值和特征向量的求取
  19. 转载TortoiseSVN的使用详解2(http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html)
  20. vue3.0需要学习的技术栈

热门文章

  1. Mysql:事务管理——未完待续
  2. ASP.NET MVC雕虫小技 1-2
  3. 76.数据库操纵语言DML 定义语言 DDL 控制语言DCL
  4. 强人工智能还有多远?先用10到20年突破这5个数学问题
  5. 以色列研发出0经验AI,无需训练就能学会抠图
  6. 语音信号短时域分析之预处理(三)
  7. php正则替换imgsrc_php如何替换img中src内容
  8. as f报错 open with_一篇文章了解python常见内置异常报错
  9. php json encode html,php – json_encode不能使用html字符串作为值
  10. java Stream