洛谷题目传送门

思路分析

维护子树最值还是第一次写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)的更多相关文章

  1. SP16580 QTREE7 - Query on a tree VII

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

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

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

  3. 洛谷SP16549 QTREE6 - Query on a tree VI(LCT)

    洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次 ...

  4. 洛谷P2633/bzoj2588 Count on a tree (主席树)

    洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...

  5. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  6. QTREE5 - Query on a tree V——LCT

    QTREE5 - Query on a tree V 动态点分治和动态边分治用Qtree4的做法即可. LCT: 换根后,求子树最浅的白点深度. 但是也可以不换根.类似平常换根的往上g,往下f的拼凑 ...

  7. 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)

    洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...

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

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

  9. 【洛谷2633】Count on a tree(树上主席树)

    点此看题面 大致题意: 给你一棵树,每次问你两点之间第\(k\)小的点权,强制在线. 主席树 这种题目强制在线一般就是数据结构了. 而看到区间第\(k\)小,很容易就能想到主席树. 至少不会有人想到树 ...

随机推荐

  1. Delphi 10.3 Rio + iOS 12.1 SDK 编译错误 "libcharset.1.dylib"

    环境版本: Delphi 10.3 Rio iOS 12.1 SDK Xcode 10.1 (10B61) 错误讯息:[DCC Error] E2597 ld: file not found: /us ...

  2. 手机app测试讲座

    活动简介: 移动 面向人群: 测试工程师,软件工程师,系统运维工程师,项目经理 活动时间 基于C#的移动应用程序测试(1) 2016年5月18日 上午9:00 基于C#的移动应用程序测试(2) 201 ...

  3. ORM框架-SQLAchemy使用

    一.ORM简介 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的 ...

  4. 20155308『网络对抗技术』Exp7:网络欺诈防范

    20155308『网络对抗技术』Exp7:网络欺诈防范 原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET ...

  5. ubuntu 12.04 桌面版关闭图形界面

    对于12.04的ubuntu桌面系统,如果想在开机的时候直接进入字符界面,那可以: 编辑文件 /etc/init/lightdm.conf,在第12行附近,原句“ and runlevel [!06] ...

  6. CS229笔记:分类与逻辑回归

    逻辑回归 对于一个二分类(binary classification)问题,\(y \in \left\{0, 1\right\}\),如果直接用线性回归去预测,结果显然是非常不准确的,所以我们采用一 ...

  7. bodymovin实现将AE动画转换成HTML5动画

    做一个简单的记录,直接贴代码吧,主要还是设计师提供的那个json <!DOCTYPE html> <html> <head> <style> body ...

  8. fis入门-单文件编译之文件优化(optimize)

    FIS(Front-end Integrated Solution ),是百度的前端集成解决方案.最近几天在研究前端构建的东西,就顺便了解了下,果断各种高大上,可以到FIS官网围观感受一下.如果对fi ...

  9. Ps矩形工具的运用

    矩形工具 1.标识位置以及快捷键 位于左侧工具栏中,快键键是u,根据需求选择里面包含的工具 2.使用方法 鼠标左键点击工具,直接在图层使用,点击后拖住不放选择想要的图形后松手即可. 可以根据自身的需求 ...

  10. python-两个图片相似度算法

    # -*- coding: UTF-8 -*- """ 作者:zxj 版本:1.0 日期:19-3-24 """ import cv2 im ...