BZOJ 4034: [HAOI2015]T2 树链剖分

4034: [HAOI2015]T2


Description

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

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

Input

 第一行包含两个整数 N, M 。表示点数和操作数。

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

Output

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

Sample Input

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

Sample Output

6
9
13

HINT

 

 对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不


会超过 10^6 。

 

Source

 

题解:

裸题了,

代码来自HZWER

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 1000000000
#define mod 1000000000
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,m,cnt;
int last[100005];
int id,pos[100005],mx[100005],v[100005];
int bl[100005],size[100005],fa[100005];
ll tag[400005],sum[400005];
struct edge{int to,next;
}e[200005];
void insert(int u,int v)
{e[++cnt]=(edge){v,last[u]};last[u]=cnt;e[++cnt]=(edge){u,last[v]};last[v]=cnt;
}
void dfs(int x)
{size[x]=1;for(int i=last[x];i;i=e[i].next)if(e[i].to!=fa[x]){fa[e[i].to]=x;dfs(e[i].to);size[x]+=size[e[i].to];}
}
void dfs2(int x,int cha)
{bl[x]=cha;pos[x]=mx[x]=++id;int k=0;for(int i=last[x];i;i=e[i].next)if(e[i].to!=fa[x]&&size[e[i].to]>size[k])k=e[i].to;if(k){dfs2(k,cha);mx[x]=max(mx[x],mx[k]);}for(int i=last[x];i;i=e[i].next)if(e[i].to!=fa[x]&&e[i].to!=k){dfs2(e[i].to,e[i].to);mx[x]=max(mx[x],mx[e[i].to]);}
}
void pushdown(int l,int r,int k)
{if(l==r)return;int mid=(l+r)>>1;ll t=tag[k];tag[k]=0;tag[k<<1]+=t;tag[k<<1|1]+=t;sum[k<<1]+=t*(mid-l+1);sum[k<<1|1]+=t*(r-mid);
}
void add(int k,int l,int r,int x,int y,ll val)
{if(tag[k])pushdown(l,r,k);if(l==x&&y==r){tag[k]+=val;sum[k]+=(r-l+1)*val;return;}int mid=(l+r)>>1;if(x<=mid)add(k<<1,l,mid,x,min(mid,y),val);if(y>=mid+1)add(k<<1|1,mid+1,r,max(mid+1,x),y,val);sum[k]=sum[k<<1]+sum[k<<1|1];
}
ll query(int k,int l,int r,int x,int y)
{if(tag[k])pushdown(l,r,k);if(l==x&&y==r)return sum[k];int mid=(l+r)>>1;ll ans=0;if(x<=mid)ans+=query(k<<1,l,mid,x,min(mid,y));if(y>=mid+1)ans+=query(k<<1|1,mid+1,r,max(mid+1,x),y);return ans;
}
ll query(int x)
{ll ans=0;while(bl[x]!=1){ans+=query(1,1,n,pos[bl[x]],pos[x]);x=fa[bl[x]];}ans+=query(1,1,n,1,pos[x]);return ans;
}
int main()
{n=read();m=read();for(int i=1;i<=n;i++)v[i]=read();for(int i=1;i<n;i++){int u=read(),v=read();insert(u,v);}dfs(1);dfs2(1,1);for(int i=1;i<=n;i++)add(1,1,n,pos[i],pos[i],v[i]);int opt,x,a;while(m--){opt=read();x=read();if(opt==1){a=read();add(1,1,n,pos[x],pos[x],a);}if(opt==2){a=read();add(1,1,n,pos[x],mx[x],a);}if(opt==3)printf("%lld\n",query(x));}return 0;
}

 

转载于:https://www.cnblogs.com/zxhl/p/5267187.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql把游标数据存入表中_mysql数据库怎么使用游标

存储过程完整代码.CREATE DEFINERrootlocalhost PROCEDURE cj_zongfen()BEGINDECLARE yw INT;#语文成绩DECLARE sx INT;#数学成绩DECLARE yy INT;#英语成绩DECLARE d INT;DECLARE nf BOOLEAN DEFAULT TRUE;DECLARE zongfen_cursor CURSOR FOR SELECT yuwen,shuxue,yingyu,cid …

yum安装ruby_centos 6.5 ruby环境安装

redis3.0以上支持集群&#xff0c;自带集群管理工具redis-trib.rb&#xff1b;在搭建集群前&#xff0c;安装ruby环境安装开发工具1、命令&#xff1a;yum groupinstall "Development tools"清理已安装过的2、命令&#xff1a;yum erase ruby ruby-libs ruby-mode ru…

mongodb3.0 性能測试报告 一

mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三測试环境&#xff1a; 服务器&#xff1a;X86 pcserver 共6台 cpu&#xff1a; 单颗8核 内存&#xff1a;64G 磁盘&#xff1a; raid 10 操作系统 &#xff1a;centos 6.5 mongo…

db2 某个字段排序_MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序...

MySQL常规排序、自定义排序和按中文拼音字母排序&#xff0c;在实际的SQL编写时&#xff0c;我们有时候需要对条件集合进行排序。下面给出3中比较常用的排序方式&#xff0c;mark一下1.常规排序ASC DESCASC 正序DESC倒叙-- 此处不用多讲2.自定义排序自定义排序是根据自己想要的…

QML官方系列教程——QML Applications

附网址&#xff1a;http://qt-project.org/doc/qt-5/qmlapplications.html假设你对Qt的官方demo感兴趣&#xff0c;能够參考本博客的另一个系列Qt5官方demo解析集每一个绿色字体均是一篇博文连接。请收藏本文&#xff0c;本文会持续更新 。QML Applications —— QML应用程序QM…

51单片机基本刷屏测试实验_基于单片机的发动机振动速度、位移和加速度测量方法...

Single-chip microcomputer-based measuring of engine vibration  speed、displacement and accelerationAbstract: This paper presents a measuring method of engine vibration speed、displacement and acceleration。At first the signal from vibration senor of engin…

python正则表达式group用法_【Python】正则表达式用法

导读&#xff1a;正则在各语言中的使用是有差异的&#xff0c;本文以 Python 3 为基础。本文主要讲述的是正则的语法&#xff0c;对于 re 模块不做过多描述&#xff0c;只会对一些特殊地方做提示。很多人觉得正则很难&#xff0c;在我看来&#xff0c;这些人一定是没有用心。其…

HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。...

今天&#xff0c;在vs2013中新建了一个placard.json文件&#xff0c;当我用jq读取它的时候&#xff0c;去提示404&#xff0c;直接在浏览器访问这个文件&#xff0c;提示&#xff1a; HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本&…

python操作redis集群_python操作redis集群

strictRedis对象方法用于连接redis指定主机地址&#xff0c;port与服务器连接&#xff0c;默认db是0&#xff0c;redis默认数据库有16个&#xff0c;在配置文件中指定database 16上代码1、对redis的单实例进行连接操作根据不同的实例方法&#xff0c;与redis的命令对应python3&…

ArcGIS将CAD等高线转换为TIN/DEM数据

1.CAD图层分离 CAD快捷命令QSELECT&#xff08;快速选择&#xff09; 选择DGX,GCD图层&#xff0c;复制到新的CAD文件中 2.在ArcGIS中&#xff0c;将dwg文件转化为可编辑的要素类文件&#xff08;shapefiles&#xff09; 分析工具-提取分析-筛选 3.高程数据修正 鼠标右键生…

这周工作

这周在课上做了简单的小程序&#xff0c;做我感觉不是很好&#xff0c;好多东西不会&#xff0c;觉得上学年学的好多知识都没有搞懂&#xff0c;课下在看书期间&#xff0c;还是有好多看不懂。我在深思我我就是个打酱油的。转载于:https://www.cnblogs.com/wulaoliu/p/5277037.…

字节跳动专家会_字节跳动招聘直播策略运营专家/经理/海外财务AR BP,ACCA优先...

字节跳动是把人工智能技术大规模应用于信息分发的公司&#xff0c;短短7年&#xff0c;从最初的一个“今日头条”&#xff0c;已经发展为拥有“抖音”、“西瓜视频”、“火山小视频”、“FaceU”等十几款产品的公司。每天&#xff0c;都有6亿用户通过字节跳动的产品看见更大的世…

矩形河道中心排放污染物浓度点源二维移流扩散MATLAB解析解计算

某非可降解物质在20℃水体中从河道中心排放&#xff0c;速度与水流流速方向相同&#xff0c;排污口为时间连续点源。河道为矩形河道&#xff0c;长度16.0m&#xff0c;宽度3.0m&#xff0c;水深2.0m&#xff0c;水流流速2.0m/s。单位时间投放的污染物强度为30mg/L。假设污染物排…

elementui树状菜单tree_vue.js+element-ui做出菜单树形结构

这次给大家带来vue.jselement-ui做出菜单树形结构&#xff0c;vue.jselement-ui做出菜单树形结构的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。由于业务需要&#xff0c;要求实现树形菜单&#xff0c;且菜单数据由后台返回&#xff0c;在网上找了几…

ArcGIS如何将经纬度坐标显示转化为xy坐标显示

GIS中经纬度坐标显示如图&#xff1a; 视图-数据框属性-常规-显示&#xff08;米&#xff09; 点击确定&#xff0c;然后坐标显示就转换为xy坐标了 注意&#xff0c;以上设置只是设置了当前文档的坐标系统&#xff0c;并不是数据的坐标系 举个例子&#xff1a;我将2160这条等高…

poj 2503 Trie树

典型的Trie树&#xff0c; 算是复习一下字符串吧&#xff0c; 就是输入有点恶心&#xff0c;代码如下&#xff1a; #include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int maxn 500000100; struct Trie{bool isword;in…

尚硅谷k8s安装文档_Kubernetes(k8s)中文文档 从零开始k8s_Kubernetes中文社区

译者&#xff1a;王乐这部文档是面对想要学习Kubernetes集群的读者。如果你对入门指南已经可以满足你对这个列表上所列的需求&#xff0c;我们建议你继续阅读这个&#xff0c;因为他是根据前人积累经验所写的新手指南。当然如果除了学习入门指南知识外还希望学习IaaS&#xff0…

ArcGIS改变数据集或要素类的的坐标系(投影)

数据管理工具-投影和变换-投影-输入数据集或要素类-输出数据集或要素类-输出坐标系(选择合适的投影坐标系)

用python模拟评委打分_用vb 编写一个评委打分的程序1. 编写一个评委打分的程序,实现以下功能:a) 单击“评委给分”按钮时弹出InputBo...

共回答了20个问题采纳率&#xff1a;80%Dim a(10) As IntegerPrivate Sub Command1_Click()For i 1 To 10a(i) InputBox("请输入第" & i & "个分数")Text1.Text Text1.Text & Str(a(i))Next iEnd SubPrivate Sub Command2_Click()Max a(1)…

地形图如何转换为数字高程模型(DEM)

1.设置参考坐标信息 一般的地形图没有坐标参考&#xff0c;在ArcCatalog 10.7中打开地形图&#xff0c;右键属性-空间参考-编辑&#xff0c;选择对应的空间参考坐标信息。 2..地图配准 将地形图在ArcMap中打开&#xff0c;一般地形图四角都有经纬度坐标信息&#xff0c;即通过…