一眼树链剖分或 \(LCT\),由于在学后者所以就写了。

取反操作相当于把 \(min,max\) 取反后交换,所以要维护 \(min,max,val\)。

时间复杂度 \(O(m\log n)\)。

#include<bits/stdc++.h>
#define fa(x) lct[x].fa
#define fl(x) lct[x].fl
#define mx(x) lct[x].mx
#define mn(x) lct[x].mn
#define id(x) lct[x].id
#define val(x) lct[x].val
#define sn(x,i) lct[x].sn[i]
#define inf 1000000000
using namespace std;
const int N=20005;
struct node{
int sn[2],fa,fl,mx,mn,val,id;
}lct[N];int n,m,tp,st[N];
int check(int x){
return sn(fa(x),0)!=x&&sn(fa(x),1)!=x;
}int chksn(int x){
return sn(fa(x),1)==x;
}void push_up(int x){
mx(x)=max({mx(sn(x,0)),mx(sn(x,1)),x>n?val(x):-inf});
mn(x)=min({mn(sn(x,0)),mn(sn(x,1)),x>n?val(x):inf});
}void push_down(int x){
if(!x) return;
if(fl(x)){
fl(sn(x,0))^=1,fl(sn(x,1))^=1;
swap(sn(x,0),sn(x,1)),fl(x)=0;
}if(!id(x)) return;id(x)=0,
swap(mx(sn(x,0)),mn(sn(x,0)));
swap(mx(sn(x,1)),mn(sn(x,1)));
id(sn(x,0))^=1,id(sn(x,1))^=1;
val(sn(x,0))=-val(sn(x,0));
val(sn(x,1))=-val(sn(x,1));
mx(sn(x,0))=-mx(sn(x,0));
mn(sn(x,0))=-mn(sn(x,0));
mx(sn(x,1))=-mx(sn(x,1));
mn(sn(x,1))=-mn(sn(x,1));
}void rotate(int x){
int y=fa(x),z=fa(y),k=chksn(x);
if(!check(y))
sn(z,chksn(y))=x;
fa(x)=z,fa(y)=x,fa(sn(x,1-k))=y;
sn(y,k)=sn(x,1-k),sn(x,1-k)=y;
push_up(y);
}void splay(int x){
st[tp=1]=x;
for(int i=x;!check(i);i=fa(i)) st[++tp]=fa(i);
while(tp) push_down(st[tp--]);
while(!check(x)){
int y=fa(x),z=fa(y);
if(!check(y))
rotate(chksn(x)!=chksn(y)?x:y);
rotate(x);
}push_up(x);
}void access(int x){
for(int i=0;x;i=x,x=fa(x))
splay(x),sn(x,1)=i,push_up(x);
}void mk(int x){
access(x),splay(x),fl(x)^=1;
}void split(int x,int y){
mk(x),access(y),splay(y);
}void link(int x,int y){
mk(x),access(y),fa(x)=y;
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n,mx(n)=-inf,mn(n)=inf;
mx(0)=-inf,mn(0)=inf;
for(int i=1;i<n;i++){
mx(i)=-inf,mn(i)=inf;
int x,y,z;cin>>x>>y>>z;
mx(n+i)=mn(n+i)=val(n+i)=z;
link(x,n+i),link(n+i,y);
}while(1){
string s;int x,y;cin>>s;
if(s=="DONE") break;
cin>>x>>y;
if(s=="NEGATE"){
split(x,y),id(y)^=1;
swap(mx(y),mn(y)),val(y)=-val(y);
mx(y)=-mx(y),mn(y)=-mn(y);
}if(s=="CHANGE")
mk(n+x),mn(n+x)=mx(n+x)=val(n+x)=y;
if(s=="QUERY") split(x,y),cout<<mx(y)<<"\n";
}return 0;
}

[POJ3237] 树的维护 题解的更多相关文章

  1. Cogs 1583. [POJ3237]树的维护 LCT,树链剖分

    题目:http://cojs.tk/cogs/problem/problem.php?pid=1583 1583. [POJ3237]树的维护 ★★★☆   输入文件:maintaintree.in  ...

  2. cogs1583. [POJ3237]树的维护

    1583. [POJ3237]树的维护 http://www.cogs.pro/cogs/problem/problem.php?pid=1583 ★★★☆   输入文件:maintaintree.i ...

  3. COGS 1583. [POJ3237]树的维护

    二次联通门 : COGS 1583. [POJ3237]树的维护 /* COGS 1583. [POJ3237]树的维护 树链剖分 + 边权化点权 线段树 单点修改 + 区间取相反数 + 查询区间最大 ...

  4. 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包

    题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...

  5. hdu 1556 Color the ball(线段树区间维护+单点求值)

    传送门:Color the ball Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/3276 ...

  6. poj3237 树链部分 边权模板

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7384   Accepted: 2001 Description ...

  7. cogs 1583. [POJ 3237] 树的维护 树链剖分套线段树

    1583. [POJ 3237] 树的维护 ★★★★   输入文件:maintaintree.in   输出文件:maintaintree.out   简单对比时间限制:5 s   内存限制:128 ...

  8. HDU 6315 Naive Operations(线段树+区间维护)多校题解

    题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...

  9. HDU1540 Tunnel Warfare(线段树区间维护&求最长连续区间)题解

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  10. CodeForces 587 E.Duff as a Queen 线段树动态维护区间线性基

    https://codeforces.com/contest/587/problem/E 一个序列, 1区间异或操作 2查询区间子集异或种类数 题解 解题思路大同小异,都是利用异或的性质进行转化,st ...

随机推荐

  1. js 计算过去和未来的时间距离现在多少天

    计算传入的任意一时间.计算出这个时间距离现在还有多少天!或者计算过去的时间距离现在已经过去了多少天! 返回值有两种! 1.负值 代表过去了多少天 2.正值 代表距离设定的时间还有多少天 说明:距离设定 ...

  2. Codeforces Round 992 (Div. 2) 解题报告

    比赛地址: https://codeforces.com/contest/2040 A. Game of Division 题目 https://codeforces.com/contest/2040 ...

  3. 【异或运算】codeforces 1153 B. Dima and a Bad XOR

    前言 异或运算:是一种在二进制数系统中使用的逻辑运算.它的基本规则是对两个二进制位进行比较,如果这两个位不同,则结果为 \(1\):如果相同,则结果为 \(0\). 异或运算的规则 \(0\) XOR ...

  4. 二进制安装Kubernetes(k8s)v1.32.0

    二进制安装Kubernetes(k8s)v1.32.0 介绍 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 kubernetes(k ...

  5. docker安装配置redis

    ​ 安装redis docker pull redis 配置数据路径 mkdir -p /home/redis/data docker启动 docker run -d -v /home/redis/d ...

  6. 在腾讯云 EMR 上使用 GooseFS 加速大数据计算服务

    GooseFS 是腾讯云对象存储团队最新推出的高性能.高可用以及可弹性伸缩的分布式缓存系统,依靠对象存储(Cloud Object Storage,COS)作为数据湖存储底座的成本优势,为数据湖生态中 ...

  7. 时代新宠儿——HEIF图像格式:节省50%空间

    HEIF全称High Efficiency Image File Format(高效图像文件格式),是一种高效的图片封装格式,文件名通常为.heif或者.heic后缀.HEIF能够在保持画质不变的前提 ...

  8. Alpine中安装telnet

    lpine Linux是一个基于musl libc和busybox的安全轻量的Linux发行版. 在Alpine中安装telnet,并不是apk add telnettelnet被移入子包busybo ...

  9. Qt设置运行时动态库路径的几点说明

    随着需求的不断增加,程序不断变大,用到的动态库也越来越多,到了发布程序的时候你会发现和可执行文件同一目录下文件数量真多(比如著名的金融软件 https://www.webull.com/ 哎呀我去,目 ...

  10. Qt开发经验小技巧141-145

    QImage支持xpm图标,查看Qt内置的QStyle风格的代码中可以发现大量的xpm图标定义,通过代码的形式来产生图标,哇咔咔好牛逼. static const char * const imgDa ...