题目传送门

这道题可以树链剖分+线段树。

其他操作模板,第二个操作只需要将x~x+size[x]-1区间加值即可。

code:

#include <cstdio>
#include <cstring>
using namespace std; int read(){
char c;while(c=getchar(),(c<''||c>'')&&c!='-');
int x=,y=;c=='-'?y=-:x=c-'';
while(c=getchar(),c>=''&&c<='')x=x*+c-'';
return x*y;
} const int Maxn=; int N,Q,A[Maxn];
int head[Maxn],nxt[Maxn<<],to[Maxn<<],Cnt;
void Add(int x,int y){
to[Cnt]=y;
nxt[Cnt]=head[x];
head[x]=Cnt;
Cnt++;
} int Son[Maxn],Size[Maxn],f[Maxn];
int Dep[Maxn],Dfn[Maxn],Top[Maxn];
int C;
void Find(int Now,int Deep,int Bef){ f[Now]=Bef,Dep[Now]=Deep,Size[Now]=;
for(int i=head[Now];i!=-;i=nxt[i]){
if(to[i]==f[Now])continue;
Find(to[i],Deep+,Now);
Size[Now]+=Size[to[i]];
if(Size[to[i]]>Size[Son[Now]])
Son[Now]=to[i];
}
return ;
}
void Fs(int Now,int Tp){
Dfn[Now]=++C,Top[Now]=Tp;
if(Son[Now])Fs(Son[Now],Tp);
for(int i=head[Now];i!=-;i=nxt[i]){
if(to[i]==Son[Now]||to[i]==f[Now])continue;
Fs(to[i],to[i]);
}
return ;
} long long Seg[Maxn<<],Ade[Maxn<<];
void Up(int x){Seg[x]=Seg[x<<]+Seg[x<<|];}
void Down(int x,long long l,long long r){
if(!Ade[x])return ;
Seg[x<<]+=Ade[x]*l;
Seg[x<<|]+=Ade[x]*r;
Ade[x<<]+=Ade[x];
Ade[x<<|]+=Ade[x];
Ade[x]=;
}
void Updata(int Node,int L,int R,int Ul,int Ur,long long Val){
if(Ul<=L&&Ur>=R){
Seg[Node]+=Val*(R-L+);
Ade[Node]+=Val;
return ;
}
int Mid=L+R>>;
Down(Node,Mid-L+,R-Mid);
if(Mid>=Ul)Updata(Node<<,L,Mid,Ul,Ur,Val);
if(Mid< Ur)Updata(Node<<|,Mid+,R,Ul,Ur,Val);
Up(Node);
}
long long Query(int Node,int L,int R,int Ql,int Qr){
if(Ql<=L&&Qr>=R)return Seg[Node];
int Mid=L+R>>;
Down(Node,Mid-L+,R-Mid);
long long Ans=;
if(Mid>=Ql)Ans+=Query(Node<<,L,Mid,Ql,Qr);
if(Mid< Qr)Ans+=Query(Node<<|,Mid+,R,Ql,Qr);
return Ans;
}
long long G(int Node){
long long Ans=;
while(Top[Node]){
Ans+=Query(,,N,Dfn[Top[Node]],Dfn[Node]);
Node=f[Top[Node]];
}
return Ans;
} int main()
{
memset(head,-,sizeof head);
N=read(),Q=read();
for(int i=;i<=N;i++)A[i]=read();
for(int i=;i<N;i++){
int x=read(),y=read();
Add(x,y),Add(y,x);
}
Find(,,),Fs(,);
for(int i=;i<=N;i++)
Updata(,,N,Dfn[i],Dfn[i],A[i]);
for(int i=;i<=Q;i++){
int Type=read(),x=read();
if(Type==)Updata(,,N,Dfn[x],Dfn[x],read());
if(Type==)Updata(,,N,Dfn[x],Dfn[x]+Size[x]-,read());
if(Type==)printf("%lld\n",G(x));
}
return ;
}

BZOJ4034_树上操作_KEY的更多相关文章

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

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

  2. HAOI2015 树上操作

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

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

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

  4. bzoj4034[HAOI2015]树上操作 树链剖分+线段树

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

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

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

  6. P3178 [HAOI2015]树上操作

    P3178 [HAOI2015]树上操作 思路 板子嘛,其实我感觉树剖没啥脑子 就是debug 代码 #include <bits/stdc++.h> #define int long l ...

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

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

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

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

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

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

随机推荐

  1. echarts柱状图,改变柱状颜色

    在使用echarts产生的柱状图中,有时候自动产生的颜色大不如人意,可以通过以下参数进行修改. series : [ { name:'天数', type:'bar', stack: '天', data ...

  2. maven的pom.xml文件报错问题

    第一次用 Spring Starter Project 创建一个Spring应用时,POM 文件报错: Project build error: Non-resolvable parent POM f ...

  3. 操作dict时避免出现KeyError的几种方法

    在读取dict的key和value时,如果key不存在,就会触发KeyError错误,如: Python t = { ', ', ', } print(t['d']) 就会出现: <code c ...

  4. Linux 循环遍历文件目录

    操作系统: Unbuntu 问题域:在一个文件目录下,嵌套有多个子目录,需要遍历这些子目录,并在子目录下进行相关操作,譬如:批量重命名,目录下的文件:又或者需要,设定工程目录(mvn versions ...

  5. 硬盘分区表知识——详解硬盘MBR

    这片文章说得很详细,原文:http://hi.baidu.com/waybq/blog/item/3b8db64bef3dc7f583025c66.html --------------------- ...

  6. iOS:多媒体(18-01-25更)

    1.音频 2.视频 1. 2.AVPlayer 1.音频 2.视频 1. 2.AVPlayer 0).写在前面 AVPlayer 主要包含 AVPlayer.AVPlayerItem.AVPlayer ...

  7. C++程序设计入门(上) string类的基本用法

    string类中的函数 1. 构造 2. 追加 3. 赋值 4. 位置与清除 5. 长度与容量 6. 比较 7. 子串 8. 搜索 9. 运算符 追加字符串 string s1("Welc ...

  8. functional filter()

    #include "pch.h" #include <iostream> #include <deque> #include <string> ...

  9. Docker 学习记录(基础命令)

    1. 获取镜像 docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]  ===>   docker pull ubuntu:16:04 2.运 ...

  10. $.trim() 去除空格方法 (验证使用)