[HAOI2015]T2

【题目描述】

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

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

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

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

【输入格式】

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

接下来一行N个整数,表示树中节点的初始权值。

接下来N-1行每行两个正整数fr,to,表示该树中存在一条边(fr,to)。

再接下来M行,每行分别表示一次操作。其中第一个数表示该操作的种类(1~3),之后接这个操作的参数(x或者x a)。

【输出格式】

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

【样例输入】

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

【样例输出】

6

9

13

【提示】

对于30%的数据,N,M<=1000

对于50%的数据,N,M<=100000且数据随机。

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

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<algorithm>
  7 #include<vector>
  8 #include<queue>
  9 using namespace std;
 10 typedef long long LL;
 11 const LL maxn=100010;
 12 inline LL read(){
 13     LL x=0,f=1;char ch=getchar();
 14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 16     return x*f;
 17 }
 18 vector<LL> to[maxn];
 19 LL N,M;
 20 LL a[maxn];
 21 LL dep[maxn],fa[maxn],son[maxn],top[maxn],siz[maxn],id[maxn];
 22 LL val[maxn];
 23 LL num;
 24 inline void dfs1(LL rt,LL fath,LL deep){
 25     dep[rt]=deep; siz[rt]=1; fa[rt]=fath;
 26     for(LL i=0;i<to[rt].size();i++){
 27         LL y=to[rt][i];
 28         if(y!=fa[rt]){
 29             dfs1(y,rt,deep+1);
 30             siz[rt]+=siz[y];
 31             if(siz[son[rt]]<siz[y]) son[rt]=y;
 32         }
 33     }
 34 }
 35 inline void dfs2(LL rt,LL tp){
 36     top[rt]=tp; id[rt]=++num;
 37     if(son[rt]!=0) dfs2(son[rt],tp);
 38     for(LL i=0;i<to[rt].size();i++){
 39         LL y=to[rt][i];
 40         if(y!=fa[rt]&&y!=son[rt]){
 41             dfs2(y,y);
 42         }
 43     }
 44 }
 45 struct node{
 46     LL l,r;
 47     LL sum,lazy;
 48 }tree[maxn*8];
 49 inline void build(LL rt,LL l,LL r){
 50     tree[rt].l=l; tree[rt].r=r;
 51     if(l==r){
 52         tree[rt].sum=val[l];
 53         tree[rt].lazy=0;
 54         return ;
 55     }
 56     LL mid=(l+r)>>1;
 57     build(rt<<1,l,mid); build(rt<<1|1,mid+1,r);
 58     tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
 59 }
 60 inline void update_son(LL rt){
 61     LL d=tree[rt].lazy;
 62     if(d!=0){
 63         tree[rt<<1].sum+=(tree[rt<<1].r-tree[rt<<1].l+1)*d;
 64         tree[rt<<1|1].sum+=(tree[rt<<1|1].r-tree[rt<<1|1].l+1)*d;
 65         tree[rt<<1].lazy+=d; tree[rt<<1|1].lazy+=d;
 66         tree[rt].lazy=0;
 67     }
 68 }
 69 inline void change(LL rt,LL l,LL r,LL delta){
 70     if(l<=tree[rt].l&&tree[rt].r<=r){
 71         tree[rt].sum+=(tree[rt].r-tree[rt].l+1)*delta;
 72         tree[rt].lazy+=delta;
 73         return ;
 74     }
 75     update_son(rt);
 76     LL mid=(tree[rt].l+tree[rt].r)>>1;
 77     if(l<=mid) change(rt<<1,l,r,delta);
 78     if(mid+1<=r) change(rt<<1|1,l,r,delta);
 79     tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
 80 }
 81 inline LL query(LL rt,LL l,LL r){
 82     if(l<=tree[rt].l&&tree[rt].r<=r){
 83         return tree[rt].sum;
 84     }
 85     update_son(rt);
 86     LL ans=0;
 87     LL mid=(tree[rt].l+tree[rt].r)>>1;
 88     if(l<=mid) ans+=query(rt<<1,l,r);
 89     if(mid+1<=r) ans+=query(rt<<1|1,l,r);
 90      return ans;
 91 }
 92 inline void ASK(LL x){
 93     LL tp=top[x],ans=0;
 94     while(x!=0&&tp!=0){
 95         ans+=query(1,id[tp],id[x]);
 96         x=fa[tp]; tp=top[x];
 97     }
 98     printf("%lld\n",ans);
 99 }
100 int main(){
101     N=read(); M=read();
102     for(LL i=1;i<=N;i++) a[i]=read();
103     for(LL i=1,u,v;i<=N-1;i++){
104         u=read(); v=read();
105         to[u].push_back(v); to[v].push_back(u);
106     }
107     dis[1]=a[1];
108     dfs1(1,0,1); dfs2(1,1);
109     for(LL i=1;i<=N;i++) val[id[i]]=a[i];
110     build(1,1,num);
111     for(LL i=1,kin;i<=M;i++){
112         kin=read();
113         if(kin==1){
114             LL x=read(),d=read();
115             change(1,id[x],id[x],d);
116         }
117         else if(kin==2){
118             LL x=read(),d=read();
119             change(1,id[x],id[x]+siz[x]-1,d);
120         }
121         else if(kin==3){
122             LL x=read();
123             ASK(x);
124         }
125     }
126     return 0;
127 }

 

转载于:https://www.cnblogs.com/CXCXCXC/p/5022114.html

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

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

相关文章

BestCoder Round #39 解题报告

现场只做出前三题w 不过不管怎样这既是第一次认真打BC 又是第一次体验用在线编译器调代码 订正最后一题花了今天一整个下午&#xff08;呜呜 收获还是比较大的^_^ Delete wld有n个数(a1,a2,...,an)&#xff0c;他希望进行k次删除一个数的操作&#xff0c;使得最后剩下的n−k个数…

linux :vim 实现命令行下输出进度条

1、 进度条原理&#xff1a; 进度条的的动态增长是利用人的视觉短暂停留效果的&#xff0c;不断从输出缓冲区刷新出相同的内容&#xff0c;在肉眼看来进度条在不断的增长。 在显示器上先输出[# ][%1] 刷新一次之后&#xff0c; …

***jquery选择器 之 获取父级元素、同级元素、子元素

一、获取父级元素1、 parent([expr]): 获取指定元素的所有父级元素 <div id"par_div"><a id"href_fir" href"#">href_fir</a><a id"href_sec" href"#">href_sec</a><a id"href_thr&q…

Sql Server字符串函数

字符串函数用于对字符和二进制字符进行各种操作 1.ASCII()函数 ASCII(character_expression)函数用于返回字符串表达式中最左侧的ASCII代码值。参数character_expression必须是一个char或varchar类型的字符串表达式。 eg: select ASCII(s),ASCII(sql),ASCII(1);执行结果如图:字…

linux 编辑器vim配置

1、 基本配置 对vim进行配置的目的&#xff1a; 进行vim配置&#xff0c;可以让我们在后续敲代码更加方便。按F5可以直接编译并执行C、C代码以及执行shell脚本&#xff1b;按“F8”可进行C、C代码的调试&#xff1b;“Ctrl A”为全选并复制快捷键&#xff0c;方便复…

Java从入门到精通——数据库篇Mongo DB GridFS文件系统

一、概述GridFS是MongoDB的一种存储机制&#xff0c;用来存储大型二进制文件。优点&#xff1a;1.使用GridFS能够简化你的栈。如果已经在使用MongoDB&#xff0c;那么可以使用GridFS来代替独立的文件存储工具2.GridFS会自动平衡已有的复制或者为MongoDB设置的自动分片&#xff…

centos 7上ambari安装试用

2019独角兽企业重金招聘Python工程师标准>>> 1、有三台centos7&#xff0c;名字分别是ws11.localdomain, ws12.localdomain, ws13.localdomain。配置epel源(安装epel-release)。 2、配置root用户ssh无密码访问。 3、安装ntp对时服务。 4、关闭防火墙。centos7下使…

进程管理—进程描述符(task_struct)

本文章转载自&#xff1a;http://blog.csdn.net/qq_26768741/article/details/54348586?locationNum4&fps1 前言 当把一个程序加载到内存当中&#xff0c;此时&#xff0c;这个时候就有了进程&#xff0c;关于进程&#xff0c;有一个相关的叫做进程控制块&#xff08;PCB&…

如何使用emacs编写c语言程序,并编译运行

vi和emacs被分别被称为编辑器之神和神之编辑器。vi的入门精通都很难&#xff0c;emacs入门容易&#xff0c;精通难&#xff1b;vi使用起来不停地切换模式&#xff0c;而emacs则不停地ctrl&#xff0c;meta等组合键。因此&#xff0c;高德纳大师说操作Emacs&#xff0c;就像弹奏…

jQuery 鼠标滚轮插件应用 mousewheel

jQuery Mousewheel Plugin,用于添加跨浏览器的鼠标滚轮支持。 mousewheel事件的处理函数有一点小小的变化&#xff0c;它除了第一个参数event 外&#xff0c;还接收到第二个参数delta。 通过参数delta可以获取鼠标滚轮的方向和速度。 如果delta的值是负的即-1&#xff0c;那么滚…

操作系统中常见的进程调度算法

一、调度与调度算法 调度&#xff1a;操作系统管理了系统的有限资源&#xff0c;当有多个进程&#xff08;或多个进程发出的请求&#xff09;要使用这些资源时&#xff0c;因为资源的有限性&#xff0c;必须按照一定的原则选择进程&#xff08;请求&#xff09;来占用资源。这…

大规模快速发展

Jez Humble在 GOTO Berlin 2015会议上讨论了限制大规模快速发展的组织障碍&#xff0c;并提到了如何解决这些障碍。InfoQ对他进行了采访&#xff0c;主要关于我们如何专注于价值而不是成本&#xff0c;为什么对工件的共识非常的有价值&#xff0c;当你不知道客户需要的特性时就…

粘滞位 File文件内容

t权限&#xff08;粘滞位)&#xff1a; 是‘不可删除’权限&#xff0c;就是说即使某用户拥有这个文件的rwx权限&#xff0c;可以随意修改文件内容&#xff0c;但是就是不能删除&#xff0c;甚至不能修改文件名&#xff0c;只有root才行。t权限也可以直接用 chmod ot/at fil…

hdu 3864 素数分解

题意&#xff1a;求n是否只有4个因子&#xff0c;如果是就输出除1外的所有因子。 模板题&#xff0c;就不排版了 1 #include<cstdio>2 #include<iostream>3 #include<algorithm>4 #include<cstring>5 #include<cmath>6 #include<queue>7 #…

QQuickRenderControl

2019独角兽企业重金招聘Python工程师标准>>> http://doc.qt.io/qt-5/qquickrendercontrol.html http://translate.google.com.hk/translate?hlzh-CN&slauto&tlen&uhttp%3A%2F%2Fhabrahabr.ru%2Fpost%2F247477%2F http://www.kdab.com/overview-qt3d-2-…

线程的控制(创建、等待、终止)、分离线程

一、线程控制 1、线程&#xff1a;线程是资源调度的基本单位&#xff0c;线程是进程内部的一个执行流&#xff0c;在进程的地址空间内运行。在Linux 下没有真正意义上的线程&#xff0c;线程是用进程模拟的&#xff0c;又被称为轻量级进程。 2、由于同⼀一进程的多个线程共享同…

从netty-example分析Netty组件

分析netty从源码开始 准备工作&#xff1a; 1.下载源代码&#xff1a;https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程。 netty提供了一个netty-example工程&#xff0c; 分类如下&#xff1a; Fundamental Echo ‐ the very basic client and …

$GLOBALS -- 变量

可以在$GLOBALS中获得所有的变量 $GLOBALS天然就是一个有很多内容的变量 $_SERVER $jackson "Example content";$_GET[A] A;$_GET[B] B; 于是乎 就有了 $GLOBALS[A]$GLOBALS[B]$GLOBALS[jackson]转载于:https://www.cnblogs.com/qinqiu/p/4475836.html

背景图片适应屏幕百分百

<!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1" /><title>背景图片大小</title> </head><style>body{margin: 0;…

20150504-日报

1、Delphi中的存储过程 参数 数据类型Delphi7中的使用存储过程的话&#xff0c;加入要获取输入参数的话&#xff0c;一般都是通过这样的方式&#xff1a;with spDelRights do begin if Active then Close; Parameters.Clear; Parameters.Refresh; Parameters.ParamByName(usern…