BZOJ4034_树上操作_KEY
这道题可以树链剖分+线段树。
其他操作模板,第二个操作只需要将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的更多相关文章
- 【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树
[BZOJ4034][HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 ...
- HAOI2015 树上操作
HAOI2015 树上操作 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根 ...
- bzoj千题计划242:bzoj4034: [HAOI2015]树上操作
http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...
- bzoj4034[HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6163 Solved: 2025[Submit][Stat ...
- 树剖||树链剖分||线段树||BZOJ4034||Luogu3178||[HAOI2015]树上操作
题面:P3178 [HAOI2015]树上操作 好像其他人都嫌这道题太容易了懒得讲,好吧那我讲. 题解:第一个操作和第二个操作本质上是一样的,所以可以合并.唯一值得讲的点就是:第二个操作要求把某个节点 ...
- P3178 [HAOI2015]树上操作
P3178 [HAOI2015]树上操作 思路 板子嘛,其实我感觉树剖没啥脑子 就是debug 代码 #include <bits/stdc++.h> #define int long l ...
- bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4352 Solved: 1387[Submit][Stat ...
- bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6779 Solved: 2275[Submit][Stat ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
随机推荐
- python的进度条实现
进度条最主要的问题就是所有字符全部在同一行,而且可以修改.然而当执行print语句的时候,python会在打印完这个语句的同时,在结尾加上换行‘\n’,这就导致在控制台下一旦被print之后就无法修改 ...
- Java虚拟机10:Client模式和Server模式的区别
部分商用虚拟机中,Java程序最初是通过解释器对.class文件进行解释执行的,当虚拟机发现某个方法或代码块运行地特别频繁的时候,就会把这些代码认定为热点代码Hot Spot Code(这也是我们使用 ...
- MyBatis使用自定义TypeHandler转换类型的实现方法
From: http://www.manongjc.com/article/15577.html 这篇文章主要介绍了MyBatis使用自定义TypeHandler转换类型的实现方法,本文介绍使用Typ ...
- xss实现获取内网ip
前提得浏览器支持webRTC,测试的时候google浏览器测试成功,火狐浏览器不支持webRTC, 再在xss平台直接复制如下js代码: function form_ip(ip,port){ var ...
- Windows安装openssl
Windows下有两种方式安装openssl,第一种是采用安装包方式进行安装,第二种是采用编译源码方式进行安装.这里采用第一种方式,简单,直接. windows的openssl安装包的下载地址为:ht ...
- uva 10369 Arctic Network (最小生成树加丁点变形)
The Department of National Defence(DND)wishestoconnectseveral northern outposts by a wireless networ ...
- 404 Note Found 队 Alpha8
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- 【Step By Step】将Dotnet Core部署到Docker(中)
在Docker中运行MySql MySQL 官方也提供了各种版本的MySQL Image来供用户使用,我们可以使用如下命令来创建并运行一个MySQL Image: docker run -it -p ...
- STM32F103 ucLinux开发之三(内核启动后不正常)(完结)
STM32F103 ucLinux内核没有完全启动 从BOOT跳转到内核后,执行一长段的汇编语言,然后来到startkernel函数,开启C语言之旅. 但是内核输出不正常,如下所示: Linux ve ...
- Java中的集合框架-Map
前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从 ...