luogu

vjudge

题意

一棵树,每个点初始有个点权和颜色(输入会给你)

0 u :询问所有u,v路径上的最大点权,要满足u,v路径上所有点的颜色都相同

1 u :反转u的颜色

2 u w :把u的点权改成w

\(color_i\in [0,1],w_i\in [−10^9,10^9],n,m≤10^5\)

sol

和\(QTree 6\)很像啊。丢个链接就跑

只要额外对每个点维护一个虚子树的最大权值即可。

开一个\(multiset\)写起来比较爽。

然后就做完了

code

我不会说我因为快读打错了debug了一个晚上的

#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 1e5+5;
int n,m,col[N],w[N],fa[N];
vector<int>G[N];
struct LCT{
int fa[N],ch[2][N],mx[N];
multiset<int>S[N];
bool son(int x){return x==ch[1][fa[x]];}
bool isroot(int x)
{
return x!=ch[0][fa[x]]&&x!=ch[1][fa[x]];
}
void pushup(int x)
{
mx[x]=max(max(mx[ch[0][x]],mx[ch[1][x]]),w[x]);
if (!S[x].empty()) mx[x]=max(mx[x],*S[x].rbegin());
}
void rotate(int x)
{
int y=fa[x],z=fa[y],c=son(x);
ch[c][y]=ch[c^1][x];if (ch[c][y]) fa[ch[c][y]]=y;
fa[x]=z;if (!isroot(y)) ch[son(y)][z]=x;
ch[c^1][x]=y;fa[y]=x;pushup(y);
}
void splay(int x)
{
for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
if (!isroot(y)) son(x)^son(y)?rotate(x):rotate(y);
pushup(x);
}
void access(int x)
{
for (int y=0;x;y=x,x=fa[x])
{
splay(x);if (ch[1][x]) S[x].insert(mx[ch[1][x]]);
ch[1][x]=y;if (ch[1][x]) S[x].erase(mx[ch[1][x]]);
pushup(x);
}
}
int findroot(int x)
{
access(x);splay(x);
while (ch[0][x]) x=ch[0][x];
splay(x);return x;
}
void link(int x,int y)
{
if (!y) return;
access(y);splay(y);splay(x);
fa[x]=y;S[y].insert(mx[x]);pushup(y);
}
void cut(int x,int y)
{
if (!y) return;
access(x);splay(x);
ch[0][x]=fa[ch[0][x]]=0;pushup(x);
}
}T[2];
void dfs(int u,int f)
{
for (int i=0,sz=G[u].size();i<sz;++i)
{
int v=G[u][i];if (v==f) continue;
T[col[v]].link(v,u);fa[v]=u;
dfs(v,u);
}
}
int main()
{
n=gi();
for (int i=1;i<n;++i)
{
int u=gi(),v=gi();
G[u].push_back(v);G[v].push_back(u);
}
for (int i=1;i<=n;++i) col[i]=gi();
for (int i=1;i<=n;++i) w[i]=gi();
T[0].mx[0]=T[1].mx[0]=-2147483647;
dfs(1,0);m=gi();
while (m--)
{
int opt=gi(),u=gi();
if (!opt){
T[col[u]].access(u);int ff=T[col[u]].findroot(u);
if (col[ff]==col[u]) printf("%d\n",T[col[u]].mx[ff]);
else printf("%d\n",T[col[u]].mx[T[col[u]].ch[1][T[col[u]].findroot(u)]]);
}
else if (opt==1) T[col[u]].cut(u,fa[u]),col[u]^=1,T[col[u]].link(u,fa[u]);
else{
T[col[u]].access(u);T[col[u]].splay(u);
w[u]=gi();T[col[u]].pushup(u);
}
}
return 0;
}

[SP16580]QTREE7的更多相关文章

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

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

  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. SP16580 QTREE7 - Query on a tree VII

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

  4. LCT总结——应用篇(附题单)(LCT)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--概念篇戳这里 题单 灰常感谢XZY巨佬提供的强力资磁!(可参考XZY巨佬的博客总结) 题单对于系 ...

  5. 一些$LCT$的瓜皮题目

    一些瓜皮 放几个比较优(she)秀(pi)的\(LCT\)题. 老惯例,每一题代码因为一些未知原因消失了(如果要的话私我好了,虽然会咕咕咕). 嘴巴\(AC\)真香! [SP16580] QTREE7 ...

  6. LCT题单(自己的做题情况反馈)(转自Flash)

    LCT题单(自己的做题情况反馈)(转自Flash) 随时进Flash Hu的LCT看一发 也可以看一下我自己的风格的板子 开始 维护链信息(LCT上的平衡树操作) [X] 洛谷P3690 [模板]Li ...

  7. 【SPOJ】QTREE7(Link-Cut Tree)

    [SPOJ]QTREE7(Link-Cut Tree) 题面 洛谷 Vjudge 题解 和QTREE6的本质是一样的:维护同色联通块 那么,QTREE6同理,对于两种颜色分别维护一棵\(LCT\) 每 ...

  8. SPOJ QTREE7

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

  9. 【转载】LCT题单

    本篇博客的题单转载自FlashHu大佬的博客:LCT总结--应用篇(附题单)(LCT). 关于\(LCT\)可以查看这篇博客:\(LCT\)入门. 这里面有些题解的链接是空链接,尚未补全. 维护链信息 ...

随机推荐

  1. Python学习进程(10)字典

        本节介绍Python中的字典:是另一种可变容器模型,且可存储任意类型对象.     (1)字典简介: 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割 ...

  2. MyEclipse Could not create the view: An unexpected exception was thrown解决方案

    问题:电脑突然断电,myeclipse非正常关闭,“Package Explorer”非正常显示,出现错误“Could not create the view: An unexpected excep ...

  3. 泛型学习第二天——C#中的List<string>泛型类示例

    在C#代码中使用一系列字符串(strings)并需要为其创建一个列表时,List<string>泛型类是一个用于存储一系列字符串(strings)的极其优秀的解决办法.下面一起有一些Lis ...

  4. 集群环境ssh免密码登录设置

    一.准备工作 1) 用客户端工具(ssh client或者putty)连接到linux服务器.在root用户下输入命令 vi /etc/hosts,用vi编辑hosts文件,如下: #127.0.0. ...

  5. HDFS相关概念

    数据块 每个磁盘都有默认的数据块大小,这是磁盘进行数据读写的最小单位.构建与单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的快.该文件系统块的大小可以使磁盘块的整数倍.文件系统块一般为几千字节,而 ...

  6. Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'company' in 'class java.lang.String'

    Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ' ...

  7. 运行tomcat,报错:Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误

    运行tomcat时,报错: Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误 原因分析: 这是因为之前已开启了一 ...

  8. Java之File文件类

    package IoDemo; import java.io.File; import java.io.FileFilter; import java.io.IOException; import j ...

  9. Functions should do one thing一个函数应该只做一件事

    if you take nothing else away from this guide other than this, you'll be ahead of many developers. 如 ...

  10. Codeforces 895C Square Subsets:状压dp【组合数结论】

    题目链接:http://codeforces.com/problemset/problem/895/C 题意: 给你n个数a[i].(n <= 10^5, 1 <= a[i] <= ...