P2590 [ZJOI2008]树的统计(树链剖分)
虽然是入门树剖模板
但是我终于1A了(大哭)
懒得写啥了(逃
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int Max(int a,int b){return a>b?a:b;}
inline void Swap(int &a,int &b){a^=b^=a^=b;}
#define N 30005
int n,Q,Top[N],bgs[N],siz[N],fa[N],val[N];
int ID,id[N],tmp[N],sum[N<<],mxd[N<<];
int cnt,hd[N],nxt[N<<],ed[N],poi[N<<];
#define lc o<<1
#define rc o<<1|1
#define mid (l+r)/2
inline void adde(int x,int y){
nxt[ed[x]]=++cnt; hd[x]=hd[x]?hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y;
}
inline void up(int o){
sum[o]=sum[lc]+sum[rc];
mxd[o]=Max(mxd[lc],mxd[rc]);
}
void build(int o,int l,int r){
if(l==r){sum[o]=mxd[o]=tmp[l]; return ;}
build(lc,l,mid); build(rc,mid+,r); up(o);
}
void modi(int o,int l,int r,int x,int v){
if(l==r){sum[o]=mxd[o]=v; return ;}
if(x<=mid) modi(lc,l,mid,x,v);
else modi(rc,mid+,r,x,v);
up(o);
}
int ask1(int o,int l,int r,int x1,int x2){
if(x1<=l&&r<=x2) return mxd[o];
int re=-1e9;
if(x1<=mid) re=Max(re,ask1(lc,l,mid,x1,x2));
if(x2>mid) re=Max(re,ask1(rc,mid+,r,x1,x2));
return re;
}
int ask2(int o,int l,int r,int x1,int x2){
if(x1<=l&&r<=x2) return sum[o];
int re=;
if(x1<=mid) re+=ask2(lc,l,mid,x1,x2);
if(x2>mid) re+=ask2(rc,mid+,r,x1,x2);
return re;
}
void dfs1(int x,int Fa){
fa[x]=Fa; siz[x]=;
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(to==Fa) continue;
dfs1(to,x);
if(siz[to]>siz[bgs[x]]) bgs[x]=to;
siz[x]+=siz[to];
}
}
void dfs2(int x,int tp){
tmp[id[x]=++ID]=val[x]; Top[x]=tp;
if(bgs[x]) dfs2(bgs[x],tp);
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(to==fa[x]||to==bgs[x]) continue;
dfs2(to,to);
}
}
int Amax(int x,int y){
int re=-1e9;
for(;Top[x]!=Top[y];x=fa[Top[x]]){
if(id[Top[x]]<id[Top[y]]) Swap(x,y);
re=Max(re,ask1(,,n,id[Top[x]],id[x]));
}if(id[x]>id[y]) Swap(x,y);
return Max(re,ask1(,,n,id[x],id[y]));
}
int Asum(int x,int y){
int re=;
for(;Top[x]!=Top[y];x=fa[Top[x]]){
if(id[Top[x]]<id[Top[y]]) Swap(x,y);
re+=ask2(,,n,id[Top[x]],id[x]);
}if(id[x]>id[y]) Swap(x,y);
return re+ask2(,,n,id[x],id[y]);
}
int main(){
scanf("%d",&n); int q1,q2; char opt[];
for(int i=;i<n;++i)
scanf("%d%d",&q1,&q2),adde(q1,q2),adde(q2,q1);
for(int i=;i<=n;++i) scanf("%d",&val[i]);
dfs1(,); dfs2(,);build(,,n);
scanf("%d",&Q);
while(Q--){
scanf("%s%d%d",opt,&q1,&q2);
if(opt[]=='H') modi(,,n,id[q1],q2);
else if(opt[]=='M') printf("%d\n",Amax(q1,q2));
else if(opt[]=='S') printf("%d\n",Asum(q1,q2));
}return ;
}
P2590 [ZJOI2008]树的统计(树链剖分)的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
		
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
 - 树的统计Count---树链剖分
		
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
 - [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
		
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
 - 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
		
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
 - luoguP2590 [ZJOI2008]树的统计(树链剖分)
		
luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...
 - BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
		
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
 - [ZJOI2008]树的统计——树链剖分
		
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...
 - BZOJ 1036 树的统计-树链剖分
		
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
 - BZOJ-1036   树的统计Count      链剖线段树(模板)=(树链剖分+线段树)
		
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
 - bzoj1036 树的统计 树链剖分模板
		
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
 
随机推荐
- mac控制台快捷键
			
ctrl+a //移到行首ctrl+e //移到行尾 ctrl+y // 插入最近删除的单词或语句ctrl+k //删除光标处到行尾部分ctrl+u //删除光标处到行首部分ctrl+w //删除光标 ...
 - python list成员函数extend与append的区别
			
extend 原文解释,是以list中元素形式加入到列表中 extend list by appending elements from the iterable append(obj) 是将整个ob ...
 - Redux 笔记详解
			
npm install --save redux 多数情况下,你还需要使用 React 绑定库和开发者工具. npm install --save react-redux npm install -- ...
 - HDU 2254 奥运(矩阵+二分等比求和)
			
奥运 [题目链接]奥运 [题目类型]矩阵+二分等比求和 &题解: 首先离散化城市,之后就是矩阵快速幂了,但让求的是A^(t1)+A^(t1+1)+...+A^(t2),我先想的是打表,但时间真 ...
 - Linux rz命令无效
			
rz命令无效 我习惯使用SecureCRT工具,进行远程连接Linux服务器,在进行文件传输的时候,可以使用sftp (alt+p)方式进行传输文件,也经常使用rz命令进行图形化的方式传输文件. 当r ...
 - Lambda表达式语法2
			
package airycode_java8.nice3; import airycode_java8.nice1.Employee; import org.junit.Test; import ja ...
 - python自定义安装包
			
python的第三方模块越来越丰富,涉及的领域也非常广,如科学计算.图片处理.web应用.GUI开发等.当然也可以将自己写的模块进行打包或发布.一简单的方法是将你的类包直接copy到python的li ...
 - html5 随机数函数
			
function selec(low,high){var ch=high-low+1;return Math.floor(Math.random()*ch+low);}for (var i = 0; ...
 - [openjudge-搜索]深度优先搜索之马走日
			
题目描述 描述 马在中国象棋以日字形规则移动.请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行 ...
 - skynet对Windows环境支持的版本:Windows版skynet
			
https://github.com/sanikoyes/skynet.git Skynet Skynet is a lightweight online game framework, and it ...