题目大意

有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个

操作,分为三种:

操作 1 :把某个节点 x 的点权增加 a 。

操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。

操作 3 :询问某个节点 x 到根的路径中所有点的点权和。

分析

真就是一见到这类题就得先写一次,发现错,再写一次

想清楚再写行不 -.-

方法1:树剖

方法2:入栈出栈序

入栈+,出栈 -

一个点x到根路径和,就是sum[1,in[x]]

如何区间修改呢

线段树上记录区间中 +的个数减去 -的个数

就是一次修改中权值总体要增加多少个delta

具体见代码

solution

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int M=100007; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} LL val[M];
int n,m;
int g[M],te;
struct edge{
int y,nxt;
}e[M<<1]; void addedge(int x,int y){
e[++te].y=y;e[te].nxt=g[x];g[x]=te;
} int st[M],ed[M],ty[M<<1],dd[M<<1],tdfn=0; void dfs(int x,int fa){
st[x]=++tdfn;
ty[tdfn]=1;
dd[tdfn]=val[x];
int p,y;
for(p=g[x];p;p=e[p].nxt)
if((y=e[p].y)!=fa) dfs(y,x);
ed[x]=++tdfn;
ty[tdfn]=-1;
dd[tdfn]=-val[x];
} struct seg{
LL sum,tag,sz;
}a[M<<3]; void pushup(int x){
a[x].sum=a[x<<1].sum+a[x<<1|1].sum;
} void totag(int x,LL d){
a[x].sum+=d*a[x].sz;
a[x].tag+=d;
} void pushdown(int x){
if(a[x].tag){
totag(x<<1,a[x].tag);
totag(x<<1|1,a[x].tag);
a[x].tag=0;
}
} void build(int x,int l,int r){
if(l==r){
a[x].sum=dd[l];
a[x].sz=ty[l];
a[x].tag=0;
return;
}
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
a[x].sz=a[x<<1].sz+a[x<<1|1].sz;
} void add(int x,int l,int r,int tl,int tr,LL d){
if(tl<=l&&r<=tr){
totag(x,d);
return;
}
int mid=l+r>>1;
pushdown(x);
if(tl<=mid) add(x<<1,l,mid,tl,tr,d);
if(mid<tr) add(x<<1|1,mid+1,r,tl,tr,d);
pushup(x);
} LL get(int x,int l,int r,int tl,int tr){
if(tl<=l&&r<=tr) return a[x].sum;
int mid=l+r>>1;
pushdown(x);
LL res=0;
if(tl<=mid) res+=get(x<<1,l,mid,tl,tr);
if(mid<tr) res+=get(x<<1|1,mid+1,r,tl,tr);
return res;
} int main(){
int i,kd,x,y;
n=rd(); m=rd();
for(i=1;i<=n;i++) val[i]=rd();
for(i=1;i<n;i++){
x=rd(),y=rd();
addedge(x,y);
addedge(y,x);
} dfs(1,0); build(1,1,2*n); while(m--){
kd=rd();
if(kd==1){
x=rd(); y=rd();
add(1,1,2*n,st[x],st[x],y);
add(1,1,2*n,ed[x],ed[x],y);
}
else if(kd==2){
x=rd(); y=rd();
add(1,1,2*n,st[x],ed[x],y);
}
else{
x=rd();
printf("%lld\n",get(1,1,2*n,1,st[x]));
}
}
return 0;
}

bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和的更多相关文章

  1. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  2. bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4352  Solved: 1387[Submit][Stat ...

  3. bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6779  Solved: 2275[Submit][Stat ...

  4. [BZOJ]4034: [HAOI2015]树上操作

    [HAOI2015]树上操作 传送门 题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和. 题解:树链剖分 操作1 ...

  5. BZOJ 4034 [HAOI2015]树上操作(欧拉序+线段树)

    题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...

  6. BZOJ 4034: [HAOI2015]树上操作 [欧拉序列 线段树]

    题意: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a . 操作 3 :询问某个节点 x 到根的路径中所有点的点权和. 显然树链剖分可做 ...

  7. 洛谷 P3178 BZOJ 4034 [HAOI2015]树上操作

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...

  8. BZOJ 4034 [HAOI2015]树上操作 线段树+树剖或dfs

    题意 直接照搬原题面 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...

  9. bzoj 4034: [HAOI2015]树上操作——树链剖分

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

随机推荐

  1. OO第三次电梯作业优化

    目录 第三次电梯作业个人优化 前言 优化思路 一.调度器 二.电梯 第三次电梯作业个人优化 前言 由于个人能力有限,第二次电梯作业只能完成正确性设计,没能进行优化,也因此损失了强测分数,于是第三次电梯 ...

  2. MFC中获得各种指针概述(个人觉得是很重要的重点)

    前言:这学期学习MFC(有点过时的东西),上课时,老师讲到获取当前活动指针,获取视图指针,文档指针,文档模板指针等(已晕) 后来下来真正写代码的时候发现这些几乎都是需要用到的东西,所以特此记录下,让自 ...

  3. Vue路由跳转到新页面时 默认在页面最底部 而不是最顶部 的解决

    今天碰到一个问题   vue路由跳转到新的页面时会直接显示页面最底部  正常情况下是显示的最顶部的  而且好多路由中不是全部都是这种情况  折腾好长时间也没解决  最后在网上找到了解决办法 其实原理很 ...

  4. 一个4年工作经验的java程序员的困惑,怎样才能能为一个架构师,请教大神

    一个4年工作经验的java程序员的困惑,怎样才能能为一个架构师 LZ本人想往架构师发展, 业余时间也会看一些书籍, 但是感觉没有头绪, 有些书看了,也没有地方实践 我做了4年的java开发, 在一个公 ...

  5. Ansible的使用和模块化深入

    Ansible配置 配置文件:/etc/ansible/ansible.cfg [default] 默认配置 inventory = /etc/ansible/hosts主机清单 library = ...

  6. SpringMVC 项目中引用其他 Module 中的方法

    1. 将要引用的Module 引入项目中 2. 在主Module中添加依赖, 3. 被引用的类必须放在 Module 中/src/下的某个package中,否则引用不到(重要)

  7. destoon后台权限-不给客户创始人权限并屏蔽部分功能

    1.根目录下后台入口文件admin.php $_founder = $CFG['founderid'] == $_userid ? $_userid : 0;  //  $CFG['founderid ...

  8. Python并发(一)

    假设我们要从一个网站用Python程序下载5张图片,最传统的思路就是写个for循环挨个挨个下载,但是这样做有个缺点,就是除了第一张,每张图片都必须等待前一张图片下载完毕后,才可以开始下载.由于网络有很 ...

  9. 更改activity切换方式

    overridePendingTransition(enterAnim, exitAnim); Intent intent =new Intent(this,item2.class); startAc ...

  10. apache php 多站点配置 重新整理

    需要下载的东东:apache_2.0.59-win32-x86-no_ssl.msi  (服务器软件,用来编译PHP的) php-5.1.5-Win32.zip  (PHP的主文件) 第一步:1.安装 ...