[spojQTREE7]Query on a tree VII
即QTREE5和QTREE6组合,即将原本维护子树范围内点数改为维护子树范围内最小值即可,由于最小值没有可减性,因此需要使用set
(虽然形式上与QTREE5类似,但QTREE5维护的信息更巧妙一些,而这题比较直接)
另外关于make_root中没有rev的修改,实际上也不需要改变
时间复杂度为$o(n\log^{2}n)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 vector<int>v[N];
5 int n,m,p,x,y,f[N],col[N];
6 struct LCT{
7 int fa[N],val[N],f[N],ch[N][2];
8 multiset<int>S[N];
9 LCT(){
10 memset(val,-0x3f,sizeof(val));
11 memset(f,-0x3f,sizeof(f));
12 }
13 bool check(int k){
14 return ((ch[fa[k]][0]!=k)&&(ch[fa[k]][1]!=k));
15 }
16 int which(int k){
17 return ch[fa[k]][1]==k;
18 }
19 int get(int k){
20 if (S[k].empty())return -1e9;
21 return *--S[k].end();
22 }
23 void up(int k){
24 f[k]=max(max(f[ch[k][0]],f[ch[k][1]]),max(get(k),val[k]));
25 }
26 void add_vir(int k){
27 S[fa[k]].insert(f[k]);
28 }
29 void del_vir(int k){
30 S[fa[k]].erase(S[fa[k]].find(f[k]));
31 }
32 void rotate(int k){
33 int f=fa[k],g=fa[f],p=which(k);
34 fa[k]=g;
35 if (!check(f))ch[g][which(f)]=k;
36 fa[ch[k][p^1]]=f,ch[f][p]=ch[k][p^1];
37 fa[f]=k,ch[k][p^1]=f;
38 up(f),up(k);
39 }
40 void splay(int k){
41 for(int i=fa[k];!check(k);i=fa[k]){
42 if (!check(i)){
43 if (which(i)==which(k))rotate(i);
44 else rotate(k);
45 }
46 rotate(k);
47 }
48 }
49 void access(int k){
50 int lst=0;
51 while (k){
52 splay(k);
53 if (ch[k][1])add_vir(ch[k][1]);
54 if (lst)del_vir(lst);
55 ch[k][1]=lst,up(k);
56 lst=k,k=fa[k];
57 }
58 }
59 void make_root(int k){
60 access(k);
61 splay(k);
62 }
63 int find_root(int k){
64 access(k);
65 splay(k);
66 while (ch[k][0])k=ch[k][0];
67 splay(k);
68 return k;
69 }
70 void add(int x,int y){
71 make_root(x);
72 make_root(y);
73 fa[y]=x,add_vir(y),up(x);
74 }
75 void del(int x,int y){
76 make_root(x);
77 access(y);
78 fa[y]=ch[x][1]=0,up(x);
79 }
80 void upd_val(int k,int x){
81 make_root(k);
82 val[k]=x,up(k);
83 }
84 int query(int k){
85 k=find_root(k);
86 return f[ch[k][1]];
87 }
88 }T[2];
89 void dfs(int k,int fa){
90 f[k]=fa;
91 for(int i=0;i<v[k].size();i++)
92 if (v[k][i]!=fa)dfs(v[k][i],k);
93 }
94 int main(){
95 scanf("%d",&n);
96 for(int i=1;i<n;i++){
97 scanf("%d%d",&x,&y);
98 v[x].push_back(y);
99 v[y].push_back(x);
100 }
101 dfs(1,n+1);
102 for(int i=1;i<=n;i++){
103 scanf("%d",&col[i]);
104 T[col[i]].add(f[i],i);
105 }
106 for(int i=1;i<=n;i++){
107 scanf("%d",&x);
108 T[0].upd_val(i,x),T[1].upd_val(i,x);
109 }
110 scanf("%d",&m);
111 for(int i=1;i<=m;i++){
112 scanf("%d%d",&p,&x);
113 if (!p)printf("%d\n",T[col[x]].query(x));
114 if (p==1){
115 T[col[x]].del(f[x],x);
116 col[x]^=1;
117 T[col[x]].add(f[x],x);
118 }
119 if (p==2){
120 scanf("%d",&y);
121 T[0].upd_val(x,y);
122 T[1].upd_val(x,y);
123 }
124 }
125 return 0;
126 }
[spojQTREE7]Query on a tree VII的更多相关文章
- bzoj3639: Query on a tree VII
Description You are given a tree (an acyclic undirected connected graph) with n nodes. The tree node ...
- BZOJ 3639: Query on a tree VII
Description 一棵树,支持三种操作,修改点权,修改颜色,问所有与他路径上颜色相同的点的最大权,包含这两个点. Sol LCT. 用LCT来维护重边,对于每个节点在建一个set用来维护轻边,这 ...
- 2019.02.17 spoj Query on a tree VII(链分治)
传送门 跟QTREE6QTREE6QTREE6神似,改成了求连通块里的最大值. 于是我们对每条链开一个heapheapheap维护一下即可. MDMDMD终于1A1A1A链分治了. 代码: #incl ...
- SP16580 QTREE7 - Query on a tree VII
Description 一棵树,每个点初始有个点权和颜色(0/1) 0 u :询问所有u,v 路径上的最大点权,要满足u,v 路径上所有点的颜色都相同 1 u :反转u 的颜色 2 u w :把u 的 ...
- BZOJ 3639: Query on a tree VII LCT_set维护子树信息
用 set 维护子树信息,细节较多. Code: #include <cstring> #include <cstdio> #include <algorithm> ...
- 洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)
洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写 ...
- SP16580 QTREE7 - Query on a tree VII(LCT)
题意翻译 一棵树,每个点初始有个点权和颜色(输入会给你) 0 u:询问所有u,v路径上的最大点权,要满足u,v路径上所有点颜色相同 1 u:反转u的颜色 2 u w:把u的点权改成w 题解 Qtree ...
- HDU 6191 Query on A Tree(字典树+离线)
Query on A Tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Othe ...
- Query on a tree——树链剖分整理
树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...
随机推荐
- DistSQL:像数据库一样使用 Apache ShardingSphere
Apache ShardingSphere 5.0.0-beta 深度解析的第一篇文章和大家一起重温了 ShardingSphere 的内核原理,并详细阐述了此版本在内核层面,特别是 SQL 能力方面 ...
- visualbox安装ubuntu18过程中不能输入name,password,密码,姓名问题的解决办法+一些基本操作
问题描述:visualbox安装ubuntu18,,,,卡在注册处,无法输入姓名,密码-点击无法输入............如下图: 解决办法:更改你的Ubuntu的主板内存,主板内存默认的值 ...
- pg_basebackup报错: pg_basebackup: incompatible server version 12.4
pg_basebackup报错 今日从库复制主库data时,发现pg_basebackup无法使用,详情如下: 错误为:incompatible server version 12.4 [postgr ...
- springboot 事务执行全流程分析
springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...
- Map中getOrDefault()与数值进行比较
一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...
- 什么是关系图 (ERD)?
首先,什么是实体关系图? 实体关系图,也称为ERD,ER图或ER模型,是一种用于数据库设计的结构图.一个ERD包含不同的符号和连接器,它们可视化两个重要信息:系统范围内的主要实体,以及这些实体之间的相 ...
- ffmpeg剪视频
ffmpeg裁剪合并视频 ffmpeg提供简单的命令参数: ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTP ...
- 简明教程 | Docker篇 · 其二:Dockerfile的编写
Dockerfile是什么 一个包含用于组合 image 的命令的文本文件,docker 通过 dockerfile 和构建环境的上下文来构建 image . 编写Dockerfile FROM 首先 ...
- Noip模拟19(炸裂的开始) 2021.7.18
T1 u 差分与前缀的综合练习. 分析数据范围,只能是在修改的时候$O(1)$做到,那么只能是像打标记一样处理那个三角形 正解是建立两个二位前缀和,一个控制竖向,一个控制斜向 每次在三角的左上,右下, ...
- 2021.8.3考试总结[NOIP模拟29]
T1 最长不下降子序列 数据范围$1e18$很不妙,但模数$d$只有$150$,考虑从这里突破. 计算的式子是个二次函数,结果只与上一个值有关,而模$d$情况下值最多只有$150$个,就证明序列会出现 ...