题目描述

有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:

  • 操作 1 :把某个节点 x 的点权增加 a 。
  • 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。
  • 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。

输入格式

第一行包含两个整数 N, M 。表示点数和操作数。
接下来一行 N 个整数,表示树中节点的初始权值。
接下来 N-1 行每行两个正整数 from, to , 表示该树中存在一条边 (from, to) 。
再接下来 M 行,每行分别表示一次操作。其中第一个数表示该操作的种类( 1-3 ) ,之后接这个操作的参数( x 或者 x a ) 。

输出格式

对于每个询问操作,输出该询问的答案。答案之间用换行隔开。

输入输出样例

输入 #1
5 5
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
输出 #1
6
9
13

说明/提示

对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不会超过 10^6 。


一道树链剖分模板题。。。,比洛谷树链剖分模板题还简单

【模板】树链剖分需要支持路径修改子树修改子树查询路径查询

这道题只需要支持单点修改子树修改路径查询,而且路径的左端点还固定为1,其实这道题应该是蓝题的。。。

哦对了,重要的事情说三遍:

开long long开long long开long long

不会树链剖分的小伙伴可以参考以下博客

博客1

博客2

想联系树链剖分的同学们也可以参考以下题目

[NOI2015]软件包管理器

【模板】树链剖分

[SDOI2011]染色

好了废话不多数,放代码吧

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct SYM{
int to,next;
}edge[];
struct ASJ{
long long sum;
long long lz;
}tree[];
int head[],tot;
int n,m;
int w[],dep[],fa[],son[],siz[],top[],wet[],id[];
void addedge(int x,int y){
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
}
void build(int i,int l,int r){ //建树
if(l==r){
tree[i].sum=wet[l];
return ;
}
int mid=(l+r)/;
build(*i,l,mid); //左儿子
build(*i+,mid+,r); //右儿子
tree[i].sum=(tree[*i].sum+tree[*i+].sum);
}
void pushdown(int i,long long len){ //LAZY下传
tree[*i].lz+=tree[i].lz;
tree[*i+].lz+=tree[i].lz;
tree[*i].sum+=(tree[i].lz*(len-len/));
tree[*i+].sum+=(tree[i].lz*(len/));
tree[i].lz=; //别忘了清零
}
void update(int i,int l,int r,int L,int R,long long k){//更新操作
if(l>=L&&r<=R){
tree[i].sum+=k*(r-l+);
tree[i].lz+=k;
return ;
}
int mid=(l+r)/;
pushdown(i,(r-l+)); //下传LAZY
if(L<=mid) update(*i,l,mid,L,R,k);
if(R>mid) update(*i+,mid+,r,L,R,k);
tree[i].sum=tree[*i].sum+tree[*i+].sum;
}
long long query(int i,int l,int r,int L,int R){//查询操作
long long ans=;
if(l>=L&&r<=R){
return tree[i].sum;
}
int mid=(l+r)/;
pushdown(i,(r-l+));
if(L<=mid) ans+=query(*i,l,mid,L,R);
if(R>=mid+) ans+=query(*i+,mid+,r,L,R);
return ans;
}
//----------------------------------------------------------------上面是线段树
void dfs1(int now,int from){ //处理dep,fa,siz,以及重儿子son
dep[now]=dep[from]+;
fa[now]=from;
int maxson=-;
siz[now]=;
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].to;
if(v==from) continue;
dfs1(v,now);
siz[now]+=siz[v];
if(siz[v]>maxson){
son[now]=v;
maxson=siz[v];
}
}
}
int cnt;
void dfs2(int now,int topr){ //处理重链链顶top,新点id,新点权值wet
id[now]=++cnt;
top[now]=topr;
wet[cnt]=w[now];
if(!son[now]) return;
dfs2(son[now],topr); //先处理重儿子,再处理轻儿子
for(int i=head[now];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa[now]||v==son[now]) continue;
dfs2(v,v); //每个轻儿子都是一个新的链顶,别忘了换链顶!!!
}
}
void update1(int x,int k){
update(,,n,id[x],id[x]+siz[x]-,k); //子树是连续的所以左节点id[x],右节点id[x]+siz[x]-1
}
long long q1(int x,int y){ //这里我写的有点麻烦,因为一个点固定为根1,所以其实可以省略一些,不过这里的代码是可以应用于每一个树链剖分路经查询的
long long ans=;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=query(,,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=query(,,n,id[x],id[y]);
return ans;
}
int main(){
freopen("sscz.in","r",stdin);
freopen("sscz.out","w",stdout);
int no,x,y;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
dfs1(,);
dfs2(,);
build(,,n);
while(m--){
scanf("%d",&no);
if(no==){
scanf("%d%d",&x,&y);
update(,,n,id[x],id[x],y); //单点修改
}
if(no==){
scanf("%d%d",&x,&y); //子树修改
update1(x,y);
}
if(no==){ //路径查询
scanf("%d",&x);
printf("%lld\n",q1(x,));
}
}
}

[HAOI2015]树上操作 题解的更多相关文章

  1. BZOJ4034:[HAOI2015]树上操作——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4034 https://www.luogu.org/problemnew/show/P3178 有一棵 ...

  2. 洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链, ...

  3. 【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树

    [BZOJ4034][HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 ...

  4. 树剖||树链剖分||线段树||BZOJ4034||Luogu3178||[HAOI2015]树上操作

    题面:P3178 [HAOI2015]树上操作 好像其他人都嫌这道题太容易了懒得讲,好吧那我讲. 题解:第一个操作和第二个操作本质上是一样的,所以可以合并.唯一值得讲的点就是:第二个操作要求把某个节点 ...

  5. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

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

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

  7. bzoj4034: [HAOI2015]树上操作(树剖)

    4034: [HAOI2015]树上操作 题目:传送门 题解: 树剖裸题: 麻烦一点的就只有子树修改(其实一点也不),因为子树编号连续啊,直接改段(记录编号最小和最大) 开个long long 水模版 ...

  8. HAOI2015 树上操作

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

  9. bzoj千题计划242:bzoj4034: [HAOI2015]树上操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...

随机推荐

  1. 08-Flutter移动电商实战-dio基础_伪造请求头获取数据

    在很多时候,后端为了安全都会有一些请求头的限制,只有请求头对了,才能正确返回数据.这虽然限制了一些人恶意请求数据,但是对于我们聪明的程序员来说,就是形同虚设.这篇文章就以极客时间 为例,讲一下通过伪造 ...

  2. 初识es

    初识es es是什么? es是基于Apache Lucene的开源分布式(全文)搜索引擎,,提供简单的RESTful API来隐藏Lucene的复杂性. es除了全文搜索引擎之外,还可以这样描述它: ...

  3. 新版本Mariadb安装后相关问题的解决

    给新机器Ubuntu安装的Mariadb后无法登录,通过网上各种方法修改root用户密码,仍然无法解决,耗费几个小时! 经过看日志和查手册,发现原因如下: ubuntu确实安装没有启用root用户,所 ...

  4. uniapp - 微信公众号授权登录

    [缘由] 采用uniapp进行微信小程序和微信公众号双版本开发:考虑到用户唯一性,我们后端确定了以“unionid”.作为唯一标识. 有的小伙伴估计也是刚入这坑,我就简单说一下步骤流程   [摸索] ...

  5. 隐藏一个button的方法(2种) 写出一个button的按钮(2种)

    display:none;visibility:hidden: <input type = button><button>这是一个按钮 </button>

  6. jQuery跳出each循环:JS报错:illegal break statement

    今天在JS中运用jquery中each写一个简单的循环语句时,在执行跳出循环操作时,遇到JS报错:Uncaught SyntaxError: illegal break statement 非法的br ...

  7. OTA升级常见问题

    OTA升级常见问题 问题现象:在进行 OTA 升级测试时,下载成功了升级包,在点击立即更新后,手机一直处于提示“正在更新中”,没能重启进行升级. 问题分析:经过分析发现,因为OTA 应用不具备系统权限 ...

  8. RPC接口测试(一)什么是 RPC 框架

    什么是 RPC 框架 RPC 框架----- 远程过程调用协议RPC(Remote Procedure Call Protocol)-----允许像调用本地服务一样调用远程服务. RPC是指远程过程调 ...

  9. Python3之logging模块浅析

    Python3之logging模块浅析   目录 Python3之logging模块浅析 简单用法 日志与控制台同时输出 一个同时输出到屏幕.文件的完成例子 日志文件截取 日志重复打印问题解决 问题分 ...

  10. [转]Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    原文地址:https://blog.csdn.net/qq_27093465/article/details/78544505 遇到这个 Java Serializable 序列化这个接口,我们可能会 ...