[BZOJ]4034: [HAOI2015]树上操作
[HAOI2015]树上操作
题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和。
题解:树链剖分
操作1 ,2是区间修改,3是区间和。
看题解都提示开long long 了,我也开了,可是整形相乘赋值给Long long时爆了。
简直要哭晕了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 500005
#define LL long long
using namespace std; int sumedge,cnt,n,m;
int head[maxn],size[maxn],dad[maxn],deep[maxn],top[maxn];
int tpos[maxn],re[maxn],w[maxn]; struct Tree{
int l,r;LL sum,s;
}tr[maxn<<]; struct Edge{
int x,y,nxt;
Edge(int x=,int y=,int nxt=):
x(x),y(y),nxt(nxt){}
}edge[maxn<<]; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} void add(int x,int y){
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
} void dfs(int x){
size[x]=;deep[x]=deep[dad[x]]+;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v==dad[x])continue;
dad[v]=x;dfs(v);
size[x]+=size[v];
}
} void dfs_(int x){
int s=;tpos[x]=++cnt;re[cnt]=x;
if(!top[x])top[x]=x;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&size[v]>size[s])s=v;
}
if(s){
top[s]=top[x];
dfs_(s);
}
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&v!=s)dfs_(v);
}
} void pushup(int rt){
tr[rt].sum=tr[rt<<].sum+tr[rt<<|].sum;
return;
} void pushdown(int rt){
if(!tr[rt].s)return;
tr[rt<<].s+=tr[rt].s;tr[rt<<|].s+=tr[rt].s;
tr[rt<<].sum+=(LL)(tr[rt<<].r-tr[rt<<].l+)*tr[rt].s;
tr[rt<<|].sum+=(LL)(tr[rt<<|].r-tr[rt<<|].l+)*tr[rt].s;
tr[rt].s=;return;
} void build(int rt,int l,int r){
tr[rt].l=l;tr[rt].r=r;
if(l==r){
tr[rt].sum=w[re[l]];
return;
}
int mid=(l+r)>>;
build(rt<<,l,mid);build(rt<<|,mid+,r);
pushup(rt);
} void change(int rt,int l,int r,int ql,int qr,int p){
if(l>=ql&&r<=qr){
tr[rt].sum+=(LL)(r-l+)*p;
tr[rt].s+=p;
return;
}
pushdown(rt);
int mid=(l+r)>>;
if(ql<=mid)change(rt<<,l,mid,ql,qr,p);
if(qr>mid)change(rt<<|,mid+,r,ql,qr,p);
pushup(rt);
} LL query_sum(int rt,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr){
return tr[rt].sum;
}
pushdown(rt);
int mid=(l+r)>>;LL ans=;
if(ql<=mid)ans+=query_sum(rt<<,l,mid,ql,qr);
if(qr>mid)ans+=query_sum(rt<<|,mid+,r,ql,qr);
return ans;
} LL query(int x){
LL ret=;
for(;top[x]!=;){
ret+=query_sum(,,n,tpos[top[x]],tpos[x]);
x=dad[top[x]];
}
ret+=query_sum(,,n,,tpos[x]);
return ret;
} int main(){
read(n);read(m);
for(int i=;i<=n;i++)read(w[i]);
for(int i=;i<n;i++){
int x,y;
read(x);read(y);
add(x,y);add(y,x);
}
dfs();dfs_();build(,,n);
for(int i=;i<=m;i++){
int od,x,a;
read(od);read(x);
if(od==){
read(a);
change(,,n,tpos[x],tpos[x],a);
}else if(od==){
read(a);
change(,,n,tpos[x],tpos[x]+size[x]-,a);
}else if(od==){
printf("%lld\n",query(x));
}
}
return ;
}
AC
[BZOJ]4034: [HAOI2015]树上操作的更多相关文章
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- 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]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和
题目大意 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- BZOJ 4034 [HAOI2015]树上操作(欧拉序+线段树)
题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- BZOJ 4034: [HAOI2015]树上操作 [欧拉序列 线段树]
题意: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a . 操作 3 :询问某个节点 x 到根的路径中所有点的点权和. 显然树链剖分可做 ...
- bzoj 4034: [HAOI2015]树上操作——树链剖分
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
- BZOJ 4034[HAOI2015]树上操作(树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点 ...
- 洛谷 P3178 BZOJ 4034 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
随机推荐
- 20165101 实验二 Java面向对象程序设计
20165101 实验二 Java面向对象程序设计
- QString类
1.将QString所有字母大写 QString.toUpper() 2.将QString所有字母小写 QString.toLower() 3.获取字符串的字符数 QString.length() 4 ...
- JS中函数之外不能写return
JS中return有时会遇到这种情况,具体表现为:google浏览器等浏览器可以继续执行,IE浏览器不能执行return,并且google浏览器:执行时会显示SyntaxError: Illegal ...
- cf780c
C. Andryush ...
- 【北京集训D2T3】tvt
[北京集训D2T3]tvt \(n,q \le 1e9\) 题目分析: 首先需要对两条路径求交,对给出的四个点的6个lca进行分类讨论.易于发现路径的交就是这六个lca里面最深的两个所形成的链. 然后 ...
- js的callee和caller方法
转载:http://www.css88.com/archives/1706 http://www.jb51.net/article/25561.htm 这里我们可以知道: caller的使用方法: f ...
- EL表达式自定义函数
表达式语言除了可以使用基本的运算符外,还可以使用自定义函数.通过使用自定义函数,加强了表达式语言的功能. EL表达式函数,主要功能是完成对数据的修改,统一化格式: 步骤 1.开发函数处理类,处理类就是 ...
- poi设置背景色
headStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); headStyle.setFillForegroundColor(HSSFCo ...
- L130
Trump Administration Backs Asian-Americans in Harvard CaseThe United States Justice Department on Th ...
- Django常用插件
1 富文本编辑器--tinymce 2 分页器--pure pagination 视图中 all_orgs_list = CourseOrg.objects.all() try: page = req ...