数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2
Description
有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个
Input
第一行包含两个整数 N, M 。表示点数和操作数。
Output
对于每个询问操作,输出该询问的答案。答案之间用换行隔开。
Sample Input
1 2 3 4 5
1 2
1 4
2 3
2 5
3 3
1 2 1
3 5
2 1 2
3 3
Sample Output
9
13
HINT
对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=;
int cnt,fir[maxn],to[maxn<<],nxt[maxn<<],n,m;
void addedge(int a,int b){
nxt[++cnt]=fir[a];to[cnt]=b;fir[a]=cnt;
}
long long key[maxn],tr[maxn<<],add[maxn<<];
int ID[maxn],fa[maxn],top[maxn],end[maxn],sz[maxn],son[maxn];
void Push_up(int x){
tr[x]=tr[x<<]+tr[x<<|];
}
void Add(int x,int l,int r,long long d){
tr[x]+=(r-l+)*d;
add[x]+=d;
}
void Push_down(int x,int l,int r){
if(add[x]){
int mid=(l+r)>>;
Add(x<<,l,mid,add[x]);
Add(x<<|,mid+,r,add[x]);
add[x]=;
}
}
void Updata(int node,int l,int r,int a,int b,long long d){
if(l>=a&&r<=b){
Add(node,l,r,d);
return;
}
Push_down(node,l,r);
int mid=(l+r)>>;
if(mid>=a)Updata(node<<,l,mid,a,b,d);
if(mid<b) Updata(node<<|,mid+,r,a,b,d);
Push_up(node);
}
long long Query(int node,int l,int r,int a,int b){
if(l>=a&&r<=b)return tr[node];
Push_down(node,l,r);
int mid=(l+r)>>;
long long ret=;
if(mid>=a)ret=Query(node<<,l,mid,a,b);
if(mid<b) ret+=Query(node<<|,mid+,r,a,b);
return ret;
}
void DFS(int x){
sz[x]=;
for(int i=fir[x];i;i=nxt[i]){
if(to[i]==fa[x])continue;
fa[to[i]]=x;
DFS(to[i]);
sz[x]+=sz[to[i]];
son[x]=sz[son[x]]<sz[to[i]]?to[i]:son[x];
}
}
long long Solve(int y){
long long ret=;
while(y){
ret+=Query(,,n,ID[top[y]],ID[y]);
y=fa[top[y]];
}
return ret;
}
int cont;
void DFS2(int x,int tp){
ID[x]=++cont;top[x]=tp;
if(son[x])DFS2(son[x],tp);
for(int i=fir[x];i;i=nxt[i])
if(to[i]!=fa[x]&&to[i]!=son[x])
DFS2(to[i],to[i]);
end[x]=cont;
}
int main(){
freopen("t2.in","r",stdin);
freopen("t2.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)
scanf("%lld",&key[i]); for(int i=,a,b;i<n;i++){
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
} DFS();
DFS2(,); for(int i=;i<=n;i++)
Updata(,,n,ID[i],ID[i],key[i]);
int op,x,a;
while(m--){
scanf("%d",&op);
if(op==){
scanf("%d%d",&x,&a);
Updata(,,n,ID[x],ID[x],a);
}
else if(op==){
scanf("%d%d",&x,&a);
Updata(,,n,ID[x],end[x],a);
}
else{
scanf("%d",&x);
printf("%lld\n",Solve(x));
}
}
return ;
}
数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2的更多相关文章
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1841 Solved: 598[Submit][Status] ...
- BZOJ 4034: [HAOI2015]T2( 树链剖分 )
树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...
- BZOJ 4034 [HAOI2015]T2(树链剖分)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4034 [题目大意] 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 有 M 个 ...
- bzoj 4034: [HAOI2015]T2
4034: [HAOI2015]T2 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操 ...
- 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count
这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...
- 数据结构(树链剖分,堆):HNOI 2016 network
2215. [HNOI2016]网络 ★★★☆ 输入文件:network_tenderRun.in 输出文件:network_tenderRun.out 简单对比时间限制:2 s 内存 ...
- 数据结构--树链剖分准备之LCA
有关LCA的模板题 传送门 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和 ...
- 数据结构(树链剖分):COGS 2109. [NOIP2015] 运输计划
2109. [NOIP2015] 运输计划 ★★★ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:1 s 内存限制:256 MB [题目描 ...
随机推荐
- Codeforces 552E - Vanya and Brackets【表达式求值】
给一个只有加号和乘号的表达式,要求添加一对括号使得最后结果最大.表达式长度5000,乘号最多12个,表达式中数字只有1位. 左括号一定在乘号右边,右括号一定在乘号左边,因为如果不是这样的话,一定可以调 ...
- Java_Activiti5_菜鸟也来学Activiti5工作流_之JUnit单元测试(四)
/**ActivitiSpringJuinitTest.java * author : 冯孟活 ^_^ * dates : 2015年9月2日 下午2:16:54 * class : activiti ...
- linux 简单命令
很久没有接触linux了,很多命令也忘记了,现在自己独立安装一个linux,独立安装LAMP,让自己记录下来这段. 怎么进入命令行 init 3, 回到桌面 init 5在不是root用户情况下,切换 ...
- 如何获取App当前版本号
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; NSString *currentVersion = [infoDic ...
- c++面试(一)
1.在c++中可以通过"::"来直接操作全局变量. 2.i++与++i效率的比较. (1)內建数据类型时,他们的效率差别不大. (2)自定义数据类型(类等)的情况,(++i)可以返 ...
- 深度探索va_start、va_arg、va_end
采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有大家熟悉的函数printf().s ...
- centos7 开机启动某些程序的方法
针对svn,nginx每次重启后均要手工启动,好麻烦,所以考虑将其做成开机启动,做成服务好麻烦,考虑像windows 一样,放在某个启动项中完成. 打开启动文件后,发现里面文件内容如下: #!/bin ...
- 『重构--改善既有代码的设计』读书笔记----Inline Class
如果某个类没有做太多的事情,你可以将这个类的所有特性搬移到另外一个类中,然后删除原类.可以看到,Inline Class正好和Extract Class相反,后者是将一个巨类分解成多个小类从而来分担责 ...
- TestNG Listener
常用接口 IExecutionListener 监听TestNG运行的启动和停止. IAnnotationTransformer 注解转换器,用于TestNG测试类中的注解. ISuiteList ...
- easyui tab 加载iframe 高度问题
其实按网上搜的结果,easyui 有个data-options属性是fit:true. 加上他之后会使得自适应父类的宽高. 加上之后,发现个问题,当刷新tab内容的时候高度是对的,但是新建tab的时候 ...