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. html行内元素

    定义 行内元素只占据它对应标签的边框所包含的空间,没有换行效果 div{ /* 定义行内元素*/ display:inline } 特点 多个元素可以横排显示 不支持宽高和上下margin 支持pad ...

  2. $\Large{\LaTeX}$ 常用公式

    $$\Large{\LaTeX}$$: \[\Large{\LaTeX} \] $ $ 表示行内 $$ $$ 表示独立 $\operatorname{lcm}(x)$\(\operatorname{l ...

  3. LOJ6469 Magic(trie)

    纪念我菜的真实的一场模拟赛 首先看到这个题目,一开始就很毒瘤.一定是没有办法直接做的. 我们考虑转化问题 假设,我们选择枚举\(x\),其中\(x\)是\(10\)的若干次方,那么我们只需要求有多少对 ...

  4. Mydoom样本分析报告

    文件检测 信息 值 文件名 1.virus 文件类型 WIN 32 EXE 文件大小 41664 bytes MD5 3d466b0f8ba9f3fe03e137a34d79f682 SHA-256 ...

  5. 2020.10.10--pta阶梯赛练习2补题

    7-3.N个数求和 本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(≤100).随后 ...

  6. Winform同步调用异步函数死锁原因分析、为什么要用异步

    1.前言 几年前,一个开发同学遇到同步调用异步函数出现死锁问题,导致UI界面假死.我解释了一堆,关于状态机.线程池.WindowsFormsSynchronizationContext.Post.co ...

  7. Excel一对多查找

    很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP.INDEX+MATCH中入门的,纵然你把全部的多条件查找方法 ...

  8. Java集合 - 集合知识点总结概述

    集合概述 概念:对象的容器,定义了对多个对象进项操作的的常用方法.可实现数组的功能. 和数组的区别: 数组长度固定,集合长度不固定. 数组可以存储基本类型和引用类型,集合只能存储引用类型. 位置: j ...

  9. JDK里常见容器总结

    自己总结.   扩容 线程安全   是否支持null 的key 说明 hashmap 2*length 否   是 1.8以后增加红黑树.提高检索效率 hashtable   是   否 官方不建议使 ...

  10. UltraSoft - Alpha - Scrum Meeting 6

    Date: Apr 21th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 验证了课程中心获取课程资源和作业的爬虫方式 细化前后端交互中的难 ...