QTREE5QTREE6组合,即将原本维护子树范围内点数改为维护子树范围内最小值即可,由于最小值没有可减性,因此需要使用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的更多相关文章

  1. bzoj3639: Query on a tree VII

    Description You are given a tree (an acyclic undirected connected graph) with n nodes. The tree node ...

  2. BZOJ 3639: Query on a tree VII

    Description 一棵树,支持三种操作,修改点权,修改颜色,问所有与他路径上颜色相同的点的最大权,包含这两个点. Sol LCT. 用LCT来维护重边,对于每个节点在建一个set用来维护轻边,这 ...

  3. 2019.02.17 spoj Query on a tree VII(链分治)

    传送门 跟QTREE6QTREE6QTREE6神似,改成了求连通块里的最大值. 于是我们对每条链开一个heapheapheap维护一下即可. MDMDMD终于1A1A1A链分治了. 代码: #incl ...

  4. SP16580 QTREE7 - Query on a tree VII

    Description 一棵树,每个点初始有个点权和颜色(0/1) 0 u :询问所有u,v 路径上的最大点权,要满足u,v 路径上所有点的颜色都相同 1 u :反转u 的颜色 2 u w :把u 的 ...

  5. BZOJ 3639: Query on a tree VII LCT_set维护子树信息

    用 set 维护子树信息,细节较多. Code: #include <cstring> #include <cstdio> #include <algorithm> ...

  6. 洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)

    洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写 ...

  7. SP16580 QTREE7 - Query on a tree VII(LCT)

    题意翻译 一棵树,每个点初始有个点权和颜色(输入会给你) 0 u:询问所有u,v路径上的最大点权,要满足u,v路径上所有点颜色相同 1 u:反转u的颜色 2 u w:把u的点权改成w 题解 Qtree ...

  8. HDU 6191 Query on A Tree(字典树+离线)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  9. Query on a tree——树链剖分整理

    树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...

随机推荐

  1. Hbase修复工具Hbck

    因为前面Hbase2集群出现过一次故障,当时花了一个周末才修好,就去了解整理了一些hbase故障的,事故现场可以看前面写的一篇:Hbase集群挂掉的一次惊险经历 一. HBCK一致性 一致性是指Reg ...

  2. 阿里云 Serverless 再升级,从体验上拉开差距

    差距都在细节上. Serverless 要成就云计算的下一个 10 年,不仅需要在技术上持续精进,也需要在产品体验上精耕细作. 近日,阿里云 Serverless 再度升级,发布了一系列围绕产品体验方 ...

  3. C++的智能指针学习笔记(初)

    C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...

  4. Bug概述、状态、类型、级别、优先级提交和Bug生命周期管理

    缺陷概述: 1)缺陷(Defect):是指存在于软件之中偏差,可被激活,以静态形式存在于软件内部,相当于Bug. 2)故障(Fault):当缺陷被激活后,软件运⾏中出现的状态,可引起意外情况,若不加处 ...

  5. 生产环境全链路压测平台 Takin

    什么是Takin? Takin是基于Java的开源系统,可以在无业务代码侵入的情况下,嵌入到各个应用程序节点,实现生产环境的全链路性能测试,适用于复杂的微服务架构系统. Takin核心原理图 Taki ...

  6. 6. 站在巨人的肩膀学习Java Filter型内存马

    本文站在巨人的肩膀学习Java Filter型内存马,文章里面的链接以及图片引用于下面文章,参考文章: <Tomcat 内存马学习(一):Filter型> <tomcat无文件内存w ...

  7. InitSpatialMetaData()速度慢的问题

    解决方法:with sqlite3.connect(dbfile) as con: con.enable_load_extension(True) con.execute("SELECT l ...

  8. vs2010中release模式下调试程序

    debug模式调试信息全,但是速度很慢,在数据量比较大的时候非常影响调试效率,release模式速度快,但是没有调试信息.所以在编译的时候很多编译器会提供一种折中的编译方式,在release下提供调试 ...

  9. 2021 CCPC女生赛

    newbie,A了五题铜牌收工 比赛时和队友悠哉游哉做题,想着干饭,最后幸好没滚出铜尾. 贴一下比赛过的代码 A题 签到 队友A的,判断正反方向序列是否符合要求 /*** * @Author: _Kr ...

  10. sql server 如何跟更新拼接的数据(cast用法)

    我们在实际中会做如下图的连接 执行以后这个连接就会报错了,如下图所示   然后我们用cast将数字转换为字符串在连接,如下图所示     这次连接的结果就没问题了,如下图所示     最后如果两个数字 ...