题目传送门

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

其他操作模板,第二个操作只需要将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. IOS 缓存思路

    为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时内存缓存中没有数据硬盘缓存中没有数据 当服务器返回数据时,需要做以下步骤 使用服务器的数据(比如解析.显示) 将服务器的 ...

  2. struts2 FilterDispatcher 和 StrutsPrepareAndExecuteFilter 的区别(转)

    FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.! StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatc ...

  3. Guava包学习--EventBus

    之前没用过这个EventBus,然后看了一下EventBus的源码也没看明白,(-__-)b.反正大概就是弄一个优雅的方式实现了观察者模式吧.慢慢深入学习一下. 观察者模式其实就是生产者消费者的一个变 ...

  4. [Python 多线程] Concurrent (十五)

    concurrent包只有一个模块: concurrent.futures - 启动并行任务 异步并行任务编程模块,提供一个高级的异步可执行的便利接口. futures模块提供了2个池执行器 Thre ...

  5. 20165302实验二java面向对象程序设计

    20165302实验二java面向对象程序设计 实验结果 提交点1 1.实验要求: 参考 (http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTE ...

  6. ASP.Net GridView 基础 Template模板

    一.了解Template AlternatingItemTemplate定义交替行的内容和外观,如果没有规定模板,则使用ItemTemplate:EditItemTemplate定义当前正在编辑的行的 ...

  7. PAT——1047. 编程团体赛

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

  8. 阅读基于sketch的软件定义网络测量数据平面硬件模型

    概要 硬件实现 基于sketch 功能:采集包数.流长数据,恢复五元组 重点:高速条件下性能较好,节省硬件资源 摘要: 提出一种基于sketch 数据结构的软件定义测量数据平面硬件模型,并在以现场可编 ...

  9. EF Core 2.0 已经支持自动生成父子关系表的实体

    现在我们在SQL Server数据库中有Person表如下: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Cr ...

  10. Vcenter虚拟化三部曲----SQL Server 2008 R2 数据库安装

    操作系统    Windows server 2008 R2 数据库      SQL Server 2008 R2 注意:SQL Server 2008 R2需要操作系统首先安装.NET Frame ...