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 ...
随机推荐
- js图片压缩
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- testNG中dataprovider使用的两种方式
testNG的参数化测试有两种方式:xml和dataprovider.个人更喜欢dataprovider,因为我喜欢把测试数据放在数据库里. 一.返回类型是Iterator<Object[]&g ...
- php 编译安装 mysql.so
编译mysql.so # 进入php-5.2.14源码目录 cd /usr/local/src/php- # 进入 mysql ext 的源码目录 cd ext/mysql # 构建编译配置, 假设p ...
- leetcode473 Matchsticks to Square
一开始想求所有结果为target的组合来着,但是所选元素不能重叠.用这个递归思想很简单,分成四个桶,每次把元素放在任意一个桶里面,最后如果四个桶相等就可以放进去,有一个地方可以剪枝,假如任意一个桶的元 ...
- python No tests were found问题解决方法
由于刚刚开始用python去写测试接口框架,在写的过程中遇到No tests were found问题 原因:python中unittest框架是以Test开头的方法,所以定义方法或类不能以Test开 ...
- ORA-01919: role 'PLUSTRACE' does not exist
环境:Oracle 10g,11g. 现象:在一次迁移测试中,发现有这样的角色赋权会报错不存在: SYS@orcl> grant PLUSTRACE to jingyu; grant PLUST ...
- executing in nfs will not generate core dump file
最近遇到了一个奇怪的问题. linux系统的pc搭建nfs server,开发板作为nfs client,开发板中全程root权限操作,执行的程序放到 nfs server 中 exports 出的目 ...
- caffe编译环境的错误:..build_release/src/caffe/proto/caffe.pb.h:23:35: fatal error: google/protobuf/arena.h: 没有那个文件
在搭建caffe的环境时出现错误: .build_release/src/caffe/proto/caffe.pb.h:23:35: fatal error: google/protobuf/aren ...
- C# vs2015单元测试测试资源管理器不显示测试方法
问题描述:在用VS2015用测试框架NUnit单元测试的时候,测试资源管理器死活不出现测试方法,无法运行单元测试模块 现象如下图: 原因:nunit版本不对应 解决方案:下载nunit3.0及往上的版 ...
- 擠出機步進馬達的 Steps per Unit 該如何計算?
擠出機步進馬達的 Steps per Unit 該如何計算? 這邊 Steps per Unit 指的是塑料往前推進1mm,步進馬達須要走幾步.依此定義,可知計算方式可以用 步進馬達轉一圈需要的步 ...