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 ...
随机推荐
- 【LeetCode每天一题】 Merge k Sorted Lists(合并K个有序链表)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- centos上shellcheck的安装
关于shellcheck的作用和功能,自行查阅. centos7 上安装shellcheck的过程中查了很多资料,大部分都是在ubunt下安装的,centos的比较少,然后好不容易看到一个https: ...
- js图的数据结构处理---弗洛伊德算法
function Graph() { this.graph = [ [0, 2, 4, 0, 0, 0], [0, 0, 1, 4, 2, 0], [0, 0, 0, 0, 3, 0], [0, 0, ...
- chrome debug 服务端性能
设置 http header 在 chrome 查看服务端性能 \Yii::$app->getResponse()->headers->set('Server-Timing', 'c ...
- iOS 新浪微博-1.1框架升级
在iOS 新浪微博-1.0框架搭建 中,使用的是xcode5.1.1开发.现在把重整了一下框架 改为xcode7.0开发 使用cocoaPad管理第三方库 程序将托管到github上 在改为xcode ...
- vue中使用导出表格功能
1.下载依赖 npm install -S file-saver xlsx npm install -D script-loader 2.在src下创建vendor文件夹,并在文件夹中放两个文件 Bl ...
- 移动端的rem适配
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- RN项目中使用react-native-elements报错: Unrecognized font family 'Material Icons'
查询了一些方案,但各自的环境不尽相同,最后在google中找到了答案.主要问题在于 (1)版本问题 (2)Xcode配置问题 报错如下 解决步骤: 1 . 首先需要正确安装 npm i -S reac ...
- c#之函数
1.函数 .函数 /// <summary> /// main /// 主函数(主方法)控制台的输出输入控制函数 /// </summary> /// <param na ...
- Linux 命令整理-tailf
1.tailf 跟踪日志文件 常用参数格式: tailf -n logfile 动态跟踪日志文件logfile,最初的时候打印文件的最后10行内容. 实例 查看从倒数多少行的日志信息 2.tail 跟 ...