题目传送门

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

其他操作模板,第二个操作只需要将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. JavaScript获取距离某天前或后的日期

    /** * param  Date Object:Mon May 11 13:53:08 UTC+0800 2015  * n 自param 起向后多少天 * return Date Object:M ...

  2. angularJs的过滤器扩展及自定义过滤器

    一.过滤器扩展 1.过滤器的组合使用 <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta ...

  3. BeanDefinition的创建(BeanDefinitionHolder的创建)

    这个对另一篇章Bean Definition从加载.解析.处理.注册到BeanFactory的过程的扩展. Spring框架中BeanDefinition的继承结构. Spring框架中BeanDef ...

  4. 让CI框架支持service层

    大家知道CodeIgniter框架式MVC分层的,通常大家把业务逻辑写到Controller中,而Model只负责和数据库打交道. 但是随着业务越来越复杂,controller越来越臃肿,举一个简单的 ...

  5. POJ3907 Build Your Home

    嘟嘟嘟 题意:按逆时针或顺时针给出一个多边形,求面积. 解法:直接套用公式:\(S = \frac{1}{2}|\sum _ {i = 1} ^ {n} {v_i \times v_{i + 1}}| ...

  6. AI-Info-Micron:用内存解决方案演化神经网络智能

    ylbtech-AI-Info-Micron:用内存解决方案演化神经网络智能 1.返回顶部 1. 用内存解决方案演化神经网络智能 我们的大脑每天会进行数千次极其复杂的操作.无论是提醒我们小心被炉子烫到 ...

  7. 【bootstrap】面包屑导航(Breadcrumbs)

    .breadcrumb > li + li:before { color: #CCCCCC; content: "/ "; padding: 0 5px; } <ol ...

  8. selenium + python自动化测试unittest框架学习(三)webdriver元素操作(二)

    上一篇是元素的定位,那么定位元素的目的就是对元素进行操作,例如写入文本,点击按钮,拖动等等的操作 (1)简单元素操作 简单元素操作 find_element_by_id("kw") ...

  9. UVA - 1197 (简单并查集计数)

    Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...

  10. 解决dpdk中出现IOMMU not found的问题

    问题 在使用VFIO前,需要在BIOS打开VT-x和VT-d,想把一个PCIe网卡透传到虚拟机中,发现虚拟机启动失败,提示IOMMU没有找到. 输入以下命令确定vt-d开启 dmesg | grep ...