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. 谷歌机器学习速成课程---降低损失 (Reducing Loss):随机梯度下降法

    在梯度下降法中,批量指的是用于在单次迭代中计算梯度的样本总数.到目前为止,我们一直假定批量是指整个数据集.就 Google 的规模而言,数据集通常包含数十亿甚至数千亿个样本.此外,Google 数据集 ...

  2. 妙用php中的register_shutdown_function和fastcgi_finish_request

    前言 在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和 ...

  3. Django 路由、模板和模型系统

    一.路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...

  4. easy_install

    一 setuptools 和easy_install setuptools:setuptools 是一组由PEAK(Python Enterprise Application Kit)开发的 Pyth ...

  5. 如何在Eclipse环境下安装PyDev并成功运行Python3.6代码

    准备条件: 事先安装好了Eclipse 软件 Python3.6解释器也安装好了 安装PyDev ① 打开Eclipse,到help -> Eclipse markplace 找到PyDev - ...

  6. Python 字符串概念和操作

    # 字符串概念:由单个字符串组成的一个集合 # 普通字符串(非原始字符串) str = "abc" print(str) # abc # 原始字符串(前面加r) str = r&q ...

  7. Linux 内核是如何构建

    https://github.com/MintCN/linux-insides-zh 介绍 我不会告诉你怎么在自己的电脑上去构建.安装一个定制化的 Linux 内核,这样的资料太多了,它们会对你有帮助 ...

  8. struts2实现文件的上传和下载实例[转]

    实现原理 Struts 2是通过Commons FileUpload文件上传. Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器 ...

  9. 排序算法(java版)

    一直想理解一下基本的排序算法,最近正好在搞java所以就一并了(为了便于理解,这儿都是以从小到大排序为目的) 冒泡排序 也就是比较连续的两个值,如果前面一个值大于后面一个值,则交换. 时间复杂度为O( ...

  10. C#加密解密DES字符串<转>

    using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...