[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 ...
随机推荐
- 基于python的pixiv爬虫
基于python的pixiv爬虫 1.目标 在和朋友吹逼过程中,聊到qq群机器人,突发奇想动手做一个p站每日推荐色图的色图机,遂学习爬虫. 目标: 批量下载首页推荐色图. 由于对qq机器人不熟,先利用 ...
- 解决nodejs的npm命令无反应的问题
最近在弄cordova,又要折腾nodejs了. 今天安装cordova模块的时候,看到nodejs的默认模块安装路径在c盘 于是想修改下,按命令 npm config set prefix . 结果 ...
- 洛谷3244 落忆枫音 (拓扑图dp+式子)
题目大意就是 给你一个DAG 然后添加一条边\(x->y\) ,询问以1为根的生成树的个数 QWQ 首先假设没有添加的边 答案就应该是 \[ans=\prod_{i=1}^{n} in[i] \ ...
- Windows 10下CUDA及cuDNN的安装 —— Pytorch
Windows 10下CUDA及cuDNN的安装 CUDA简介与下载地址 CUDA(ComputeUnified Device Architecture),是显卡厂商NVIDIA推出的运算平台. CU ...
- linux版火狐浏览器部署详解
Firefox下载地址 Firefox全历史版本下载: http://ftp.mozilla.org/pub/firefox/releases/ Firefox驱动问题下载 https://gith ...
- 【Python123】练习1: Python基本语法元素 (第1周)
实例1: 温度转换 这是"实例"题,与课上讲解实例相同,请作答检验学习效果. ...
- 【UE4 设计模式】单例模式 Singleton Pattern
概述 描述 保证一个类只有一个实例 提供一个访问该实例的全局节点,可以视为一个全局变量 仅在首次请求单例对象时对其进行初始化. 套路 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符. ...
- 【二食堂】Alpha - 事后分析
事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? Alpha阶段要解决的问题是:根据用户标注的信息完成知识图谱的生成渲染.要解决的问题定义得比较 ...
- 不可错过的stm32单片机直流电机驱动与测速详解
stm32直流电机驱动与测速 说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了 ...
- 数列极限计算中运用皮亚诺Taylor展开巧解
这是讲义里比较精华的几个题目,今晚翻看也是想到了,总结出来(处理k/n2形式). 推广式子如下: 例题如下: