洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)
思路分析
维护子树最值还是第一次写QwQ
因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入、删除和查询最值。
然后我就懒得手写了,毕竟Splay作为平衡树时与LCT中的Splay写法不一样,不能混用。
于是要去学习STL啦
非常感谢Kelin巨佬的代码,我终于初步掌握了一下set的用法
(比如说知道了multiset的erase某值是把所有等于该值的节点删除。。。。。。)
(还比如说知道了rbegin和end的区别。。。。。。)
于是就OK了,因为维护同色连通块的方法和Qtree6是一样的,建议先做Qtree6
顺便放一下蒟蒻的Qtree6题解
这题细节貌似有点多,放注释里
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
#define R register int
#define I inline void
const int N=100009,M=N<<1;
#define lc c[x][0]
#define rc c[x][1]
#define C lct[col[x]]
#define G ch=getchar()
template<typename T>
I gi(register T&z){
register char G;register bool fl=0;
while(ch<'-')G;
if(ch=='-')fl=1,G;
z=ch&15;G;
while(ch>'-')z*=10,z+=ch&15,G;
if(fl)z=-z;
}
int fa[N],v[N],he[N],ne[M],to[M];
bool col[N];
struct LCT{
int f[N],c[N][2],mx[N];
bool r[N];
multiset<int>s[N];
LCT(){mx[0]=-2147483647;}//因为点权可能为负,所以空节点要设成-inf
inline bool nroot(R x){return c[f[x]][0]==x||c[f[x]][1]==x;}
I pushup(R x){
mx[x]=max(v[x],max(mx[lc],mx[rc]));
if(!s[x].empty())mx[x]=max(mx[x],*s[x].rbegin());
}
I rotate(R x){
R y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];
if(nroot(y))c[z][c[z][1]==y]=x;c[x][!k]=y;c[y][k]=w;
f[w]=y;f[y]=x;f[x]=z;
pushup(y);
}
I splay(R x){
R y;
while(nroot(x)){
if(nroot(y=f[x]))rotate((c[f[y]][0]==y)^(c[y][0]==x)?x:y);
rotate(x);
}
pushup(x);
}
I access(R x){
for(R y=0;x;x=f[y=x]){
splay(x);
if(rc)s[x].insert(mx[rc]);
if((rc=y))s[x].erase(s[x].find(mx[y]));
pushup(x);
}//跟维护信息和有点像,也是加一个减一个
}
inline int findroot(R x){
access(x);splay(x);
while(lc)x=lc;
splay(x);
return x;
}
I link(R x){
splay(x);
R y=f[x]=fa[x];
access(y);splay(y);
c[y][1]=x;pushup(y);
}//另一种link写法,也是看Kelin巨佬代码学的
//这里连的是实边,因为连虚边更新信息还有点麻烦
I cut(R x){
access(x);splay(x);
lc=f[lc]=0;
pushup(x);
}
I update(R x){
access(x);splay(x);
gi(v[x]);pushup(x);
}
}lct[2];
void dfs(R x,R y){
fa[x]=y;
for(R i=he[x];i;i=ne[i])
if(to[i]!=y)dfs(to[i],x);
C.link(x);
}
int main(){
R p=1,n,m,i,x,y,op;
gi(n);
for(i=1;i<n;++i){
gi(x);gi(y);
to[++p]=y;ne[p]=he[x];he[x]=p;
to[++p]=x;ne[p]=he[y];he[y]=p;
}
for(i=1;i<=n;++i)gi(col[i]);
for(i=1;i<=n;++i)gi(v[i]);
dfs(1,fa[1]=n+1);
gi(m);
while(m--){
gi(op);gi(x);
switch(op){
case 0:printf("%d\n",C.mx[C.c[C.findroot(x)][1]]);break;
case 1:C.cut(x);col[x]^=1;C.link(x);break;
case 2:C.update(x);//AC后和Kelin巨佬的代码对比,发现我只更新了一个LCT中的,居然对了?!跟我的写法有关吧。。。。。。因为每次findroot我都splay到了根,直接改是对的吧
}
}
return 0;
}
洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)的更多相关文章
- SP16580 QTREE7 - Query on a tree VII
Description 一棵树,每个点初始有个点权和颜色(0/1) 0 u :询问所有u,v 路径上的最大点权,要满足u,v 路径上所有点的颜色都相同 1 u :反转u 的颜色 2 u w :把u 的 ...
- SP16580 QTREE7 - Query on a tree VII(LCT)
题意翻译 一棵树,每个点初始有个点权和颜色(输入会给你) 0 u:询问所有u,v路径上的最大点权,要满足u,v路径上所有点颜色相同 1 u:反转u的颜色 2 u w:把u的点权改成w 题解 Qtree ...
- 洛谷SP16549 QTREE6 - Query on a tree VI(LCT)
洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次 ...
- 洛谷P2633/bzoj2588 Count on a tree (主席树)
洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- QTREE5 - Query on a tree V——LCT
QTREE5 - Query on a tree V 动态点分治和动态边分治用Qtree4的做法即可. LCT: 换根后,求子树最浅的白点深度. 但是也可以不换根.类似平常换根的往上g,往下f的拼凑 ...
- 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...
- BZOJ 3639: Query on a tree VII LCT_set维护子树信息
用 set 维护子树信息,细节较多. Code: #include <cstring> #include <cstdio> #include <algorithm> ...
- 【洛谷2633】Count on a tree(树上主席树)
点此看题面 大致题意: 给你一棵树,每次问你两点之间第\(k\)小的点权,强制在线. 主席树 这种题目强制在线一般就是数据结构了. 而看到区间第\(k\)小,很容易就能想到主席树. 至少不会有人想到树 ...
随机推荐
- 20155304《网络对抗》Exp8 Web基础
20155304<网络对抗>Exp8 Web基础 实践要求 (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的H ...
- jsp页面中日期的格式化
在一次开发中,由于数据库中生日采用的是datetime的数据类型,因此数据库中数据格式为:2017-07-11 00:00:00. 但是,编辑页面中回显生日肯定是不可以显示出时分秒的, ...
- [c#]记一次实验室局域网的ARP欺骗
起因 某天中午午睡时,笔者被激烈的键盘和鼠标声音吵醒,发现实验室的同学在那边忘我地打LOL,顿觉不爽,于是决定整他一下.想了一下之后觉得就让他掉线一下作为惩罚好了.结合以往的理论知识,大家在同一个局域 ...
- LSTM生成尼采风格文章
LSTM生成文本 github地址 使用循环神经网络生成序列文本数据.循环神经网络可以用来生成音乐.图像作品.语音.对话系统对话等等. 如何生成序列数据? 深度学习中最常见的方法是训练一个网络模型(R ...
- EJB开发第一期---EJB开发配置
一.EJB 3.0简介 1.1 什么是EJB Enterprise JavaBeans是一个用于分布式业务应用的标准服务端组件模型.采用Enterprise JavaBeans架构编写的应用是可伸缩的 ...
- CF891C Envy
题面 题解 首先要知道两个性质: 对于任意权值,最小生成树上该权值的边数是相同的. 对于任意一个最小生成树,当加完所有权值小于一个任意值的边之后,当前图的连通性是一样的. 于是我们按照权值分开处理,对 ...
- 批量备份H3C交换机路由器配置
第一种(使用ftp下载配置文件): #!/bin/bash datetime=`date +%Y%m%d` BAKTIME=`date +%Y%m%d%H%M%S` user="admin& ...
- pie的绕过方式
目标程序下载 提取码:qk1y 1.检查程序开启了哪些安全保护机制 pie机制简介 PIE(position-independent executable) 是一个针对代码段.text, 数据段.*d ...
- 使用SignalR实时Web应用程序
实时Web应用程序能够实时地将服务器端内容推送到连接的客户端.对于ASP.NET开发人员,ASP.NET SignalR是一个向其应用程序添加实时Web功能的库.它利用了多种传输方式,根据客户端和服务 ...
- 机器视觉及图像处理系列之一(C++,VS2015)——搭建基本环境
自<人脸识别>系列发布至今,已一年多矣,期间除答复些许同好者留言外,未再更新文,盖因项目所迫,不得已转战它途,无暇.无料更博耳.其时,虽人已入项目中,然终耿怀于人脸识别方案之谬.初,写此文 ...