【题目描述】

有一棵点数为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

[HAOI2015]T2相关推荐

  1. BZOJ 4034: [HAOI2015]T2 树链剖分

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

  2. 数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2

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

  3. BZOJ 4034 [HAOI2015]T2 树链剖分

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

  4. 备战NOIP每周写题记录(一)···不间断更新

    ※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...

  5. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  6. [BZOJ4033][HAOI2015]树上染色

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2108  Solved: 901 [Submit][Sta ...

  7. NOIP2013普及组 T2 表达式求值

    OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 1 #include<iostream> 2 #include<algorithm> 3 #include&l ...

  8. Luogu P3177 [HAOI2015] 树上染色(树上背包)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P3177 [HAOI2015] 树上染色 有一棵点数为 NNN 的树,树边有边权.给你一 ...

  9. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

最新文章

  1. python post请求_python发送http的post请求
  2. Excel列数和列字母的转换(column number 和 column letters 互转)
  3. eBay Notification介绍
  4. 外星人跑深度学习_上海港汇外星人店,51M2020开光追和DLSS2.0畅玩《赛博朋克2077》...
  5. 计算机成绩表及格率怎么算,卫生资格人机对话如何考试如何评分?成绩如何核算?...
  6. 今天的这可是有原因的飞鸽传书
  7. [linux]解决DNS配置重启丢失
  8. nyoj 19 擅长排列的小明(深搜,next_permutation)
  9. 【ML小结10】集成学习
  10. 数学竞赛辅导陈启浩pdf_高中数学一题多解经典题型汇编(一)
  11. linux登陆端口号和协议,linux iso镜像下载 协议号与端口号大全
  12. 工作中的会议纪要模板
  13. Vector CANoe Option Car2X利用Car2X场景编辑器创建车联网交通场景与应用示例剖析
  14. Android热修复学习之旅开篇——热修复概述
  15. 程序猿怎么利用技术挣钱?——python量化实践
  16. HIVE启动的时候, The server time zone value ‘EDT‘ is unrecognized or represents more than one time zone.
  17. 氟化硼二吡咯BDP581/591-ALK/NH2/COOH/NHS/N3/MAL/DBCO/Hz/Tz/amine衍生物
  18. python语言通俗理解_慢步学习,python语言编程,来扯扯语言的学习理解
  19. canvas 将折线转换成曲线
  20. 计算机毕业设计之java+ssm的洗衣店管理系统

热门文章

  1. 设计模式 ---适配器模式
  2. python中使用“if __name__ == '__main__'”语句的作用
  3. 中科大 计算机网络13 FTP文件传输协议
  4. 中科大 计算机网络5 接入网和物理媒体
  5. 人生历练必备的十个心态(图)
  6. HEVC/H265 性能分析
  7. 编程语言大比拼——谁的效率高
  8. Unix 多进程编程
  9. 四种类型转换 cast
  10. v4l打开video设备 ,执行VIDIOC_DQBUF,出现Resource temporarily unavailable 问题