1036. [ZJOI2008]树的统计【树链剖分】
Description
一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成
一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I
II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身
Input
输入的第一行为一个整数n,表示节点的个数。接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有
一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1行,为一个整数q,表示操作
的总数。接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。
对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。
Output
对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。
Sample Input
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
Sample Output
4
1
2
2
10
6
5
6
5
16
树链剖分模板
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std; int head[],num_edge;
int Father[],Weight[];
int Son[],Top[];
int T_NUM[],a[];
int Depth[];
int sum,n,INF,ans;
int TREE[];
char st[];
struct node
{
int to,next;
} edge[];
struct node1
{
int max,sum;
} Segt[];
void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
}
void dfs1(int x)
{
Weight[x]=;
Depth[x]=Depth[Father[x]]+;
for (int i=head[x]; i!=; i=edge[i].next)
if (edge[i].to!=Father[x])
{
Father[edge[i].to]=x;
dfs1(edge[i].to);
Weight[x]+=Weight[edge[i].to];
if (Son[x]== || Weight[edge[i].to]>Weight[Son[x]])
Son[x]=edge[i].to;
}
} void dfs2(int x,int tp)
{
T_NUM[x]=++sum;
TREE[sum]=a[x];
Top[x]=tp;
if (Son[x]!=)
dfs2(Son[x],tp);
for (int i=head[x]; i!=; i=edge[i].next)
if (edge[i].to!=Son[x] && edge[i].to!=Father[x])
dfs2(edge[i].to,edge[i].to);
} void Build(int node,int l,int r,int a[])
{
if (l==r)
Segt[node].max=Segt[node].sum=a[l];
else
{
int mid=(l+r)/;
Build(node*,l,mid,a);
Build(node*+,mid+,r,a);
Segt[node].max=max(Segt[node*].max,Segt[node*+].max);
Segt[node].sum=Segt[node*].sum+Segt[node*+].sum;
}
} void Update(int node,int l,int r,int x,int k)
{
if (l==r)
Segt[node].max=Segt[node].sum=k;
else
{
mid=(l+r)/;
(x<=mid)
date(node*,l,mid,x,k);
else
Update(node*+,mid+,r,x,k);
Segt[node].max=max(Segt[node*].max,Segt[node*+].max);
Segt[node].sum=Segt[node*].sum+Segt[node*+].sum;
}
} int QueryMax(int node,int l,int r,int l1,int r1)
{
if (r<l1 || l>r1)
return -INF;
if (l1<=l && r<=r1)
return Segt[node].max;
int mid=(l+r)/;
return max(QueryMax(node*,l,mid,l1,r1),
QueryMax(node*+,mid+,r,l1,r1));
} int QuerySum(int node,int l,int r,int l1,int r1)
{
if (r<l1 || l>r1)
return ;
if (l1<=l && r<=r1)
return Segt[node].sum;
int mid=(l+r)/;
return QuerySum(node*,l,mid,l1,r1)+
QuerySum(node*+,mid+,r,l1,r1);
} int GetSum(int x,int y)
{
int fx,fy;
memset(&ans,,sizeof(ans));
fx=Top[x];
fy=Top[y];
while (fx!=fy)
{
if (Depth[fx]<Depth[fy])
swap(fx,fy),swap(x,y);
ans+=QuerySum(,,n,T_NUM[fx],T_NUM[x]);
x=Father[fx],fx=Top[x];
}
if (Depth[x]>Depth[y]) swap(x,y);
return ans+=QuerySum(,,n,T_NUM[x],T_NUM[y]);
} int GetMax(int x,int y)
{
int fy,fx;
memset(&ans,-0x7f,sizeof(ans));
fx=Top[x];
fy=Top[y];
while (fx!=fy)
{
if (Depth[fx]<Depth[fy])
swap(fx,fy),swap(x,y);
ans=max(ans,QueryMax(,,n,T_NUM[fx],T_NUM[x]));
x=Father[fx],fx=Top[x];
}
if (Depth[x]>Depth[y]) swap(x,y);
return max(ans,QueryMax(,,n,T_NUM[x],T_NUM[y]));
} int main()
{
int i,u,v,l,m,x,y;
memset(&INF,0x7f,sizeof(INF));
scanf("%d",&n);
for (i=; i<=n-; ++i)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for (int i=; i<=n; ++i)
scanf("%d",&a[i]);
Depth[]=;
dfs1();
dfs2(,);//两边预处理
Build(,,n,TREE);//TREE数组保存用来建线段树的区间
scanf("%d",&m);
for (int i=; i<=m; ++i)
{
scanf("%s%d%d",&st,&x,&y);
if (st[]=='H')
Update(,,n,T_NUM[x],y);
if (st[]=='M')
printf("%d\n",GetMax(x,y));
if (st[]=='S')
printf("%d\n",GetSum(x,y));
}
}
1036. [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 ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- [ZJOI2008]树的统计——树链剖分
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...
- BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- luoguP2590 [ZJOI2008]树的统计(树链剖分)
luogu P2590 [ZJOI2008]树的统计 题目 #include<iostream> #include<cstdlib> #include<cstdio> ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- bzoj1036 树的统计 树链剖分模板
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
随机推荐
- Java虚拟机--虚拟机字节码执行引擎
Java虚拟机--虚拟机字节码执行引擎 所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 用于支持虚拟机进行方法调用和方 ...
- Java虚拟机--虚拟机类加载机制
虚拟机类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类的生命周期如下: 加载 ...
- leetcode树专题894.897,919,951
满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点. 返回包含 N 个结点的所有可能满二叉树的列表. 答案的每个元素都是一个可能树的根结点. 答案中每个树的每个结点都必须有 node.va ...
- SpringMVC拦截器和@ResponseBody注解冲突
在使用@ResponseBody注解后controller方法只会返回ModelandView对象的数据模型,不会返回视图,这样有很多好处,但是如果在拦截器中进行了页面转发,在满足页面转发条件时,不会 ...
- Spring Boot使用layui的字体图标时无法正常显示 解决办法
在html文件使用字体图标并且预览时正常,但是启动工程后显示不正常,浏览器调试界面显示字体文件无法decode: Failed to decode downloaded font: xxxxx 如图所 ...
- hadoop学习之yarn资源管理
一.yarn简介 yarn是在hadoop2.x中才引入的一个新的机制,在hadoop1.x中MapReduce任务需要同时做任务管理和资源分配,那么引入yarn之后,hadoop的资源管理的任务就全 ...
- C 中结构体对齐
参考 百度百科内存对齐 对齐作用 可以使得以最少的次数将操作数加载到寄存器中,如果数据没有对齐,则当CPU以最小读取数据大小从内存读入数据时可能只取到了一部分数据,而对齐情况下可以一次读入. 对齐修改 ...
- 微信小程序上传图片(前端+PHP后端)
一.wxml文件 <text>上传图片</text> <view> <button bindtap="uploadimg">点击选择 ...
- linux下将本地文件上传到github中?
今天编写一份Python基础代码,经过Linux上传到github上,遇到点问题,已经解决 1.首先sudo su 进入root 用户 2.ls 检查出当前文件下有什么文件 3. cd 进入你将要上传 ...
- 【读书笔记】iOS-网络-错误处理的经验法则
一,在接口契约中处理错误. 二,错误状态可能不正确. 设备模糊地确认操作是崇拜失败的.比如,移动应用发出HTTP请求以在两个账户间转账.请求被银行系统接收并正确地处理:然而,由于网络失败应答却丢失了, ...