bzoj 4034: [HAOI2015]树上操作——树链剖分
Description
Input
Output
对于每个询问操作,输出该询问的答案。答案之间用换行隔开。
Sample Input
1 2 3 4 5
1 2
1 4
2 3
2 5
3 3
1 2 1
3 5
2 1 2
3 3
Sample Output
9
13
HINT
对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不会超过 10^6 。
—————————————————————————————
这道题其实也是裸题QAQ 子树求和就是求个子树内id最大的点 从根到这个点的编号刚好包含了整个子树
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int max(int x,int y){return x>y?x:y;}
int n,m;
int first[M],cnt=;
struct node{int to,next;}e[*M];
void ins(int a,int b){e[++cnt]=(node){b,first[a]}; first[a]=cnt;}
void insert(int a,int b){ins(a,b); ins(b,a);}
int top[M],sz[M],son[M],mx[M],fa[M],id[M],idp=;
void f1(int x){
sz[x]=;
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
if(now==fa[x]) continue;
fa[now]=x; f1(now);
sz[x]+=sz[now];
if(sz[now]>sz[son[x]]) son[x]=now;
}
}
void f2(int x,int tp){
top[x]=tp; mx[x]=id[x]=idp++;
if(son[x]) f2(son[x],tp),mx[x]=max(mx[x],mx[son[x]]);
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
if(now!=fa[x]&&now!=son[x]) f2(now,now),mx[x]=max(mx[x],mx[now]);
}
}
struct pos{int l,r; LL sum,tag;}tr[*M];
void build(int x,int l,int r){
tr[x].l=l; tr[x].r=r;
if(l==r) return ;
int mid=(l+r)>>;
build(x<<,l,mid);
build(x<<^,mid+,r);
}
void up(int x){tr[x].sum=tr[x<<].sum+tr[x<<^].sum;}
void down(int x){
if(tr[x].tag){
int ls=x<<,rs=x<<^;
LL v=tr[x].tag;
tr[x].tag=; tr[ls].tag+=v; tr[rs].tag+=v;
tr[ls].sum+=1LL*(tr[ls].r-tr[ls].l+)*v;
tr[rs].sum+=1LL*(tr[rs].r-tr[rs].l+)*v;
}
}
void modify(int x,int L,int R,LL s){
if(L<=tr[x].l&&tr[x].r<=R){tr[x].tag+=s; tr[x].sum+=(tr[x].r-tr[x].l+)*s; return ;}
down(x);
int mid=(tr[x].l+tr[x].r)>>;
if(L<=mid) modify(x<<,L,R,s);
if(R>mid) modify(x<<^,L,R,s);
up(x);
}
LL v[M];
LL push_sum(int x,int L,int R){
if(L<=tr[x].l&&tr[x].r<=R) return tr[x].sum;
down(x);
int mid=(tr[x].l+tr[x].r)>>;
LL ans=;
if(L<=mid) ans+=push_sum(x<<,L,R);
if(R>mid) ans+=push_sum(x<<^,L,R);
return ans;
}
LL qsum(int x){
LL sum=;
while(top[x]!=top[]){
sum+=push_sum(,id[top[x]],id[x]);
x=fa[top[x]];
}
sum+=push_sum(,id[],id[x]);
return sum;
}
int main(){
int k,x,y;
n=read(); m=read();
for(int i=;i<=n;i++) v[i]=read();
for(int i=;i<n;i++) x=read(),y=read(),insert(x,y);
build(,,n); f1(); f2(,);
for(int i=;i<=n;i++) modify(,id[i],id[i],v[i]);
for(int i=;i<=m;i++){
k=read();
if(k==) x=read(),y=read(),modify(,id[x],id[x],y);
else if(k==) x=read(),y=read(),modify(,id[x],mx[x],y);
else x=read(),printf("%lld\n",qsum(x));
}
return ;
}
bzoj 4034: [HAOI2015]树上操作——树链剖分的更多相关文章
- bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树
		
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4352 Solved: 1387[Submit][Stat ...
 - BZOJ 4034[HAOI2015]树上操作(树链剖分)
		
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点 ...
 - bzoj4034[HAOI2015]树上操作  树链剖分+线段树
		
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6163 Solved: 2025[Submit][Stat ...
 - bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
		
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
 - BZOJ 4034 [HAOI2015]T2(树链剖分)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4034 [题目大意] 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 有 M 个 ...
 - 【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树
		
[BZOJ4034][HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 ...
 - BZOJ4034 [HAOI2015]树上操作 树链剖分
		
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4034 题意概括 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三 ...
 - P3178 [HAOI2015]树上操作 树链剖分
		
这个题就是一道树链剖分的裸题,但是需要有一个魔性操作___编号数组需要开longlong!!!震惊!真的神奇. 题干: 题目描述 有一棵点数为 N 的树,以点 为根,且树点有边权.然后有 M 个操作, ...
 - BZOJ4034[HAOI2015]树上操作——树链剖分+线段树
		
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
 
随机推荐
- 代替iframe的方法
			
$('#framecont').html('').load("pageURL"); 使用jQuery.
 - 【week7】psp
			
本周psp 项目 内容 开始时间 结束时间 中断时间 净时间 2016/10/31 技术学习 看向数据库传入数据的代码 18:00 21:00 45 135 psp记录 将psp记录进电脑 21:20 ...
 - Redis哨兵的详解
			
1 哨兵的作用 哨兵是redis集群架构中非常重要的一个组件,主要功能如下: 集群监控:负责监控redis master和slave进程是否正常工作 消息通知:如果某个redis实例有故障,那么哨兵负 ...
 - Axure RP 的安装与卸载
			
官网:http://www.axure.com/download 支持Windows和Mac
 - 【bzoj1692】[Usaco2007 Dec]队列变换  贪心+后缀数组
			
题目描述 FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. ...
 - Go语言【第六篇】:Go循环语句
			
Go语言循环语句 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句,以下为大多数编程语言循环程序的流程如: Go语言提供了以下几种类型循环处理语句: 循环类型 描述 fo ...
 - P2587 [ZJOI2008]泡泡堂
			
题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组 ...
 - 【题解】Atcoder AGC#03 E-Sequential operations on Sequence
			
仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的.所以我们可以将操作序列变成单调递增的序列. 然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次 ...
 - [LOJ3057] [HNOI2019] 校园旅行
			
题目链接 LOJ:https://loj.ac/problem/3057 洛谷:https://www.luogu.org/problemnew/show/P5292 Solution 先膜一发\(m ...
 - [SDOI2015]约数个数和 莫比乌斯反演
			
---题面--- 题解: 为什么SDOI这么喜欢莫比乌斯反演,,, 首先有一个结论$$d(ij) = \sum_{x|i}\sum_{y|j}[gcd(x, y) == 1]$$为什么呢?首先,可以看 ...