BZOJ 4034 线段树+DFS序
思路:
先搞出来每个点的DFS序 (要有入栈和出栈两种状态的)
处理出来 线段树区间有多少入栈的和多少出栈的
加区间的时候就加(入-出)*wei
查前缀和
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 200050
#define int long long
int n,m,Wei[N],v[N],first[N],next[N],tot,start[N],end[N],cnt;
int xx,yy,ww,op,tree[N*20],mark[N*20],marka[N*20],vv[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x,int fa){
start[x]=++cnt;vv[cnt]=1;
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa)
dfs(v[i],x);
end[x]=++cnt;vv[cnt]=-1;
}
void push_down(int pos){
int lson=pos<<1,rson=pos<<1|1;
tree[lson]+=mark[lson]*marka[pos];
tree[rson]+=mark[rson]*marka[pos];
marka[lson]+=marka[pos];
marka[rson]+=marka[pos];
marka[pos]=0;
}
void build(int l,int r,int pos){
if(l==r){mark[pos]=vv[l];return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
build(l,mid,lson),build(mid+1,r,rson);
mark[pos]=mark[lson]+mark[rson];
}
void insert(int l,int r,int pos,int wei,int x){
if(l==r){tree[pos]+=wei;return;}
if(marka[pos])push_down(pos);
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<x)insert(mid+1,r,rson,wei,x);
else insert(l,mid,lson,wei,x);
tree[pos]=tree[lson]+tree[rson];
}
int query(int l,int r,int pos,int x){
if(r<=x){return tree[pos];}
if(marka[pos])push_down(pos);
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid>=x)return query(l,mid,lson,x);
else return query(l,mid,lson,x)+query(mid+1,r,rson,x);
}
void Change(int l,int r,int pos){
if(l>=xx&&r<=yy){
marka[pos]+=ww;
tree[pos]+=ww*mark[pos];
return;
}
if(marka[pos])push_down(pos);
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<xx)Change(mid+1,r,rson);
else if(mid>=yy)Change(l,mid,lson);
else Change(l,mid,lson),Change(mid+1,r,rson);
tree[pos]=tree[lson]+tree[rson];
}
signed main(){
memset(first,-1,sizeof(first));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&Wei[i]);
for(int i=1;i<n;i++)
scanf("%lld%lld",&xx,&yy),add(xx,yy),add(yy,xx);
dfs(1,-1);
build(1,cnt,1);
for(int i=1;i<=n;i++)
insert(1,cnt,1,Wei[i],start[i]),insert(1,cnt,1,-Wei[i],end[i]);
for(int i=1;i<=m;i++){
scanf("%lld",&op);
if(op==1){
scanf("%lld%lld",&xx,&ww);
insert(1,cnt,1,ww,start[xx]);
insert(1,cnt,1,-ww,end[xx]);
}
else if(op==2){
scanf("%lld%lld",&xx,&ww);
yy=end[xx],xx=start[xx];
Change(1,cnt,1);
}
else if(op==3){
scanf("%lld",&xx);
printf("%lld\n",query(1,cnt,1,start[xx]));
}
}
}
BZOJ 4034 线段树+DFS序的更多相关文章
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- bzoj4034 线段树+dfs序
https://www.lydsy.com/JudgeOnline/problem.php?id=4034 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 ...
- 【BZOJ-3306】树 线段树 + DFS序
3306: 树 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 792 Solved: 262[Submit][Status][Discuss] De ...
随机推荐
- 学习《数据科学入门》中文PDF+英文PDF+源代码
数据科学是一个蓬勃发展.前途无限的行业,有人将数据科学家称为"21世纪头号性感职业".本书从零开始讲解数据科学工作,教授数据科学工作所必需的黑客技能,并带领读者熟悉数据科学的核心知 ...
- AWS中国EC2 公网IP登录免pemKEY修改shh 配置文件
个人使用记录 1:KEY 授权 chmod 400 VPN.pem 2:连接 ssh -i "VPN.pem" ubuntu@ec2-54-183-119-93.us-west-1 ...
- Linux CentOs6.5误卸载自带python和yum后的解决办法
事故背景:前几天因项目需要,在服务器上搭建python-mysql模块,结果没安装好,于是乎想卸载重装,遂在网上查询卸载python的方法,结果一不小心直接把系统的python删了个干净....... ...
- caioj 1155 同余方程组(模版)
第一步,和同余方程一样,转化一下 两式相减得 这就转化为了求不定方程,用exgcd 求出x,要化成最小正整数解,避免溢出 然后可以求出P出来. 这个时候要把前两个式子转化成一个式子 设求出来的是P' ...
- 从头认识java-18.6 synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题
这一章节我们来介绍在其它对象上同步与ThreadLocal. 前一章节我们使用了 1.synchronized在其它对象上同步 class ThreadA implements Runnable { ...
- 如何检查 Android 应用的内存使用情况
Android是为移动设备而设计的,所以应该关注应用的内存使用情况.尽管Android的Dalvik虚拟机会定期执行垃圾回收操作,但这也不意味着就可以忽视应用在何时何处进行内存分配和释放.为了提供良好 ...
- 使用Javascript D3创建属于你的涂鸦作品
Matplotlib能够用来创建非常美丽精确的数学图形: 可是有时候在进行想法交流的时候,不想那么严谨正式.想使用那种轻松的.涂鸦风格的图形: MATLAB XKCDify项目能够用来生成上述的涂鸦作 ...
- 转:app store 注册账号生成证书上传app完整的教程
app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司ios开发者计划$99/年 企业ios开发者计划$299/年 高校ios开发者计划免费 在这里主要介绍一下公司ios ...
- PForDelta的介绍论文
ttp://paperhub.s3.amazonaws.com/7558905a56f370848a04fa349dd8bb9d.pdf FOR(Frame-Of-Reference),PFor(Pa ...
- RISC设计原则及基本技术
CISC的特点: 指令系统庞大,指令功能复杂,指令寻址方式多,指令格式多 绝大多数指令须要多个机器周期完毕 各种指令都能够訪问存储器 採用微程序控制 有专用寄存器,少量 难以用优化编译技术生成高效的目 ...