[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 ...
 
随机推荐
- Oracle配置tcps加密协议
			
1.Oracle用户下操作,创建证书 mkdir /home/oracle/wallet orapki wallet create -wallet "/home/oracle/wallet& ...
 - 题解 2020.10.24 考试 T4 模板
			
题目传送门 题目大意 有一个 \(n\) 个点组成的树,有 \(m\) 次操作,每次将 \(1\to x\) 的路径上每个点都加入一个颜色为 \(c\) 的小球.但是每个点都有大小限制,即小球个数超过 ...
 - scala基础篇---- Try finally不加catch的使用情形
			
普通的try-catch-finally Try{ } catch{//不加catch向上抛出异常 case _=> } finally{//一般是资源关闭 } 普通的try-finally ...
 - HTTP标签
			
系统的http状态码知识,我是在<图解http里学习的>. 状态码的职责是告知从服务器端返回的请求结果. 分类如下: 2XX --> 成功 200 OK(一般情况) 204 No C ...
 - VS2019 及 Visual Assist X 安装配置
			
Visual Studio 2019 安装 下载 https://visualstudio.microsoft.com/zh-hans/downloads/ 安装 设置 扩大 Solution Con ...
 - NKOJ-4573  Falsita
			
问题描述: 到海边了呢...... 如果没有那次选择,现在是不是会好些呢...... 都过去了. 仰望着星空,迎面吹过一阵阵海风,倚靠着护栏,Fine 在海边静静地伫立着,在一个个无际的长夜后,Fin ...
 - 计算机网络之传输层(传输层提供的服务及功能概述、端口、套接字--Socket、无连接UDP和面向连接TCP服务)
			
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105451022 学习课程:<2019王道考研计算机网络> 学习目的 ...
 - 21.6.4 test
			
\(NOI\) 模拟赛 太离谱了,碳基生物心态极限 \(T1\),字符串滚出OI,最后想了个区间dp,期望得分32pts,实际得分0pts,不知为啥挂了.正解是没学过的SAM. \(T2\),正解博弈 ...
 - 贪心-Saruman‘s Army POJ - 3069
			
万恶之源 目录 题意 思路 贪心的原则是什么呢? 错解 正解 代码实现 书上的代码 我的代码 比较一下 问题 题意 给定若干个点的坐标,与范围R.每个点可以选择是否标记,标记后这个点的左右范围R内的所 ...
 - Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了
			
转载:Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了 - 简书 (jianshu.com) 一. Gitlab-CI/CD使用场景 首先,公司使用Gitlab作为工作仓库进行代 ...