题目传送门

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

其他操作模板,第二个操作只需要将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. Shell传递参数【转载】

    Shell 传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 实例 以 ...

  2. jq封装-无缝滚动效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. python中的BaseManager通信(二)文件二分

    提供服务部分(运行时在接收端未打开前不能关闭) #mainsec.py from multiprocessing import Process, Queue from multiprocessing. ...

  4. Mybatis和Mysql的Json类型

    Mysql5.7新增加了Json类型字段,但是目前Mybatis中并不支持 1.新建MybatisJsonTypeHandler.java import com.fasterxml.jackson.a ...

  5. 【[LNOI2014]LCA】

    这题好神啊 能够\(1A\)真是不可思议 首先看到要求的这个柿子\(\sum_{i=l}^{r}deep[LCA(i,z)]\),而且\(l\)和\(r\)并不是来自与一棵子树或者一条链,而是编号连续 ...

  6. 使用plugins让打包更便捷

    之前运行dist下的js,都是手动把index.html拷贝过去的,每次把dist文件夹删除,都需要将index.html拷贝进去,这样很麻烦,我们在webpack官方插件中找到HtmlWebpack ...

  7. Web项目打成war包部署到tomcat时报MySQL Access denied for user 'root'@'localhost' (using password: YES)错误解决方案

    Web项目使用使用root账号root密码进行部署,通过Eclipse加载到Tomcat服务器可以发布成功,打成war包放到tomcat的webapps目录无法发布成功,报错: jdbc.proper ...

  8. E、CSL 的魔法 【模拟】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551#question 题目描述 有两个长度为 n 的序列,a0,a1,…,an−1a0,a1,…,an−1和 b ...

  9. PAT——1038. 统计同成绩学生

    本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第1行给出不超过105的正整数N,即学生总人数.随后1行给出N名学生的百分制整数成绩,中间以空格分隔.最后1行给出要查 ...

  10. Linux下jmap命令查看内存使用

    Linux下jmap命令查看内存使用 jmap -heap 1234(1234为进程号) jmap是JDK自带的一个工具,非常小巧方便,其支持参数如下: -heap       打印heap空间的概要 ...