SP16580 QTREE7 - Query on a tree VII(LCT)
题意翻译
一棵树,每个点初始有个点权和颜色(输入会给你)
0 u:询问所有u,v路径上的最大点权,要满足u,v路径上所有点颜色相同
1 u:反转u的颜色
2 u w:把u的点权改成w
题解
Qtree6的升级版,建议先做完再来做这题(毕竟那个代码改一改就能做这个了两倍经验岂不美哉)(Qtree6我的题解->这里)
我就当你们已经都会Qtree6了(小声)
就是把Qtree6中维护连通块中点的个数,变成维护子树中的最大值就行了
实子树的max直接用,虚子树的max可以直接丢进一个set里
然后就是access的时候虚实边转化,set里要变一下(个人感觉access的时候不需要pushup,因为虚实边转化了,子树最大值是不变的)
然后就是节点0的值赋为-inf省的pushup的时候变为0,因为节点的值会有负的
然后就是update的时候只改一颗树里的竟然对了……可能是因为findroot的时候splay过了吧……
//minamoto
#include<bits/stdc++.h>
#define Col lct[col[x]]
#define inf 0x3f3f3f3f
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=;
int f[N],Next[N<<],head[N],ver[N<<],tot,col[N],n,m,v[N];
inline void add(int u,int v){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
ver[++tot]=u,Next[tot]=head[v],head[v]=tot;
}
struct LCT{
int fa[N],ch[N][],mx[N];
multiset<int> s[N];
LCT(){mx[]=-inf;}
inline bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
#define lc ch[x][0]
#define rc ch[x][1]
inline void pushup(int x){
cmax(mx[x]=v[x],max(mx[lc],mx[rc]));
if(!s[x].empty()) cmax(mx[x],*s[x].rbegin());
}
void rotate(int x){
int y=fa[x],z=fa[y],d=ch[y][]==x;
if(!isroot(y)) ch[z][ch[z][]==y]=x;
fa[x]=z,fa[y]=x,fa[ch[x][d^]]=y,ch[y][d]=ch[x][d^],ch[x][d^]=y,pushup(y);
}
void splay(int x){
for(int y=fa[x],z=fa[y];!isroot(x);y=fa[x],z=fa[y]){
if(!isroot(y))
((ch[y][]==x)^(ch[z][]==y))?rotate(x):rotate(y);
rotate(x);
}
pushup(x);
}
void access(int x){
for(int y=;x;x=fa[y=x]){
splay(x);
if(rc) s[x].insert(mx[rc]);
if(rc=y) s[x].erase(s[x].find(mx[y]));
}
}
int findroot(int x){
access(x),splay(x);
while(lc) x=lc;
splay(x);
return x;
}
void link(int x){
access(x),splay(x);
int y=fa[x]=f[x];
access(y),splay(y);
ch[y][]=x,pushup(y);
}
void cut(int x){
access(x),splay(x);
lc=fa[lc]=;
pushup(x);
}
void update(int x){
access(x),splay(x);
v[x]=read(),pushup(x);
}
}lct[];
void dfs(int x){
for(int i=head[x];i;i=Next[i]){
int v=ver[i];
if(v==f[x]) continue;
f[v]=x,dfs(v);
}
Col.link(x);
}
int main(){
//freopen("testdata.in","r",stdin);
n=read();
for(int i=;i<n;++i){
int u=read(),v=read();
add(u,v);
}
for(int i=;i<=n;++i) col[i]=read();
for(int i=;i<=n;++i) v[i]=read();
f[]=n+,dfs();
m=read();
while(m--){
int op=read(),x=read();
switch(op){
case :print(Col.mx[Col.ch[Col.findroot(x)][]]);break;
case :Col.cut(x),col[x]^=,Col.link(x);break;
case :Col.update(x);break;
}
}
Ot();
return ;
}
SP16580 QTREE7 - Query on a tree VII(LCT)的更多相关文章
- 洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)
洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写 ...
- SP16549 QTREE6 - Query on a tree VI(LCT)
题意翻译 题目描述 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥 ...
- SP16580 QTREE7 - Query on a tree VII
Description 一棵树,每个点初始有个点权和颜色(0/1) 0 u :询问所有u,v 路径上的最大点权,要满足u,v 路径上所有点的颜色都相同 1 u :反转u 的颜色 2 u w :把u 的 ...
- QTREE5 - Query on a tree V(LCT)
题意翻译 你被给定一棵n个点的树,点从1到n编号.每个点可能有两种颜色:黑或白.我们定义dist(a,b)为点a至点b路径上的边个数. 一开始所有的点都是黑色的. 要求作以下操作: 0 i 将点i的颜 ...
- SP2666 QTREE4 - Query on a tree IV(LCT)
题意翻译 你被给定一棵n个点的带边权的树(边权可以为负),点从1到n编号.每个点可能有两种颜色:黑或白.我们定义dist(a,b)为点a至点b路径上的权值之和. 一开始所有的点都是白色的. 要求作以下 ...
- 2019.02.17 spoj Query on a tree VII(链分治)
传送门 跟QTREE6QTREE6QTREE6神似,改成了求连通块里的最大值. 于是我们对每条链开一个heapheapheap维护一下即可. MDMDMD终于1A1A1A链分治了. 代码: #incl ...
- 【SPOJ QTREE2】QTREE2 - Query on a tree II(LCA)
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...
- 洛谷SP16549 QTREE6 - Query on a tree VI(LCT)
洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次 ...
- P1501 [国家集训队]Tree II(LCT)
P1501 [国家集训队]Tree II 看着维护吧2333333 操作和维护区间加.乘线段树挺像的 进行修改操作时不要忘记吧每个点的点权$v[i]$也处理掉 还有就是$51061^2=2607225 ...
随机推荐
- [KVM][guestfs] 安装 guestfs-python 出错
pip install http://download.libguestfs.org/python/guestfs-1.36.13.tar.gz 执行后出错: 然后百度.谷歌,都是说安装 gcc 或者 ...
- 【UVA11613 训练指南】生产销售规划 【费用流】
题意: Acme公司生产一种X元素,给出该元素在未来M个月中每个月的单位售价.最大产量.最大销售量,以及最大储存时间(过期报废不过可以储存任意多的量).你的任务是计算出公司能够赚到的最大利润. 分析: ...
- centos6.5 源码安装 mysql
1.下载源码包 我的版本:mysql-5.6.4-m7.tar.gz 2.安装之前先卸载CentOS自带的MySQL [root@localhost ~]# yum remove mysql 3.编译 ...
- 空值和null区别
空值代表杯子是真空的,NULL代表杯子中装满了空气
- Oracle Data Pump 导出和导入数据
Data pump export/import(hereinafter referred to as Export/Import for ease of reading)是一种将元数据和数据导出到系统 ...
- 实践作业4:Web测试实践(小组作业)每日任务记录1
会议时间:2017年12月21日会议地点:东九教学楼自习区主 持 人:王晨懿参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元记 录 人:王晨懿会议议题:小组作业熟悉和任务分配 (一)选择待测产品 我 ...
- Go 面向对象概念
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- javascript总结21:javascript-JSON与遍历
1 什么是JSON JavaScript Object Notation(JavaScript对象表示形式) JavaScript的子集 JSON和对象字面量的区别 JSON的属性必须用双引号引号引起 ...
- java修饰符 protect public protected
1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员(子类是可以访问父类的带protected修饰符的成员的 ...
- 关于解决百度sitemap1.0一直提示校验中问题
实际原因是php设置问题,各个版本对应的设置有些不一样. php版本改成就好了. 修复方法:在插件里找到插件:\baidusubmit\inc.找到sitemap.php,查找curl_setopt( ...