【BZOJ4034】【HAOI2015】树上操作
题目请自行查阅传送门。
典型的树剖题,线段树维护操作,记一下子树在线段树内范围即可。
时间复杂度:\( O(m \log^{2} n) \)
#include <stdio.h>
#define MN 100005
#define Mn (1<<17)
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
#define ll long long
ll sum[Mn<<],mark[Mn<<];
int val[MN],siz[MN],dep[MN],fa[MN],top[MN],son[MN],head[MN],l[MN],r[MN],n,q,cnt,dfsn,root=;
struct tree{int to,nxt;}edge[MN<<];
inline int in(){
int x=,f=;
char ch=getchar();
while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
inline void ins(int x,int y){edge[++cnt].to=y,edge[cnt].nxt=head[x],head[x]=cnt;}
inline void dfs1(int u,int f,int d){
siz[u]=,dep[u]=d,fa[u]=f;
for (register int i=head[u]; i; i=edge[i].nxt)
if (edge[i].to!=f){
dfs1(edge[i].to,u,d+);siz[u]+=siz[edge[i].to];
if (siz[edge[i].to]>siz[son[u]]) son[u]=edge[i].to;
}
}
inline void dfs2(int u,int tp){
top[u]=tp,l[u]=(++dfsn);if (son[u]) dfs2(son[u],tp);
for (register int i=head[u]; i; i=edge[i].nxt)
if (edge[i].to!=son[u]&&edge[i].to!=fa[u]) dfs2(edge[i].to,edge[i].to); r[u]=dfsn;
}
inline void pushdown(int k,int l,int r){
if (l==r||!mark[k]) return;register int x=r-l+;
mark[ls]+=mark[k],mark[rs]+=mark[k];
sum[ls]+=(x-(x>>))*mark[k];sum[rs]+=(x>>)*mark[k];mark[k]=;
}
inline void combine(int k){sum[k]=sum[ls]+sum[rs];}
inline void A(int l,int r,int a,int b,int k,int ad){
if (a<=l&&r<=b){mark[k]+=ad;sum[k]+=1ll*ad*(r-l+);return;}
pushdown(k,l,r);if (a<=mid) A(l,mid,a,b,ls,ad);
if (b>mid) A(mid+,r,a,b,rs,ad);combine(k);
}
inline ll Q(int l,int r,int a,int b,int k){
if (l==a&&r==b) return sum[k];pushdown(k,l,r);
if (b<=mid) return Q(l,mid,a,b,ls);
if (a>mid) return Q(mid+,r,a,b,rs);
return Q(l,mid,a,mid,ls)+Q(mid+,r,mid+,b,rs);
}
inline ll query(int x){
register ll res=;
while (top[x]!=root) res+=Q(,n,l[top[x]],l[x],),x=fa[top[x]];
return res+=Q(,n,l[root],l[x],);
}
void init(){
n=in(),q=in();for (int i=; i<=n; ++i) val[i]=in();
for (register int i=; i<n; ++i){
register int x=in(),y=in();
ins(x,y); ins(y,x);
}
dfs1(root,,);dfs2(root,root);
for (register int i=; i<=n; ++i) A(,n,l[i],l[i],,val[i]);
}
void solve(){
while(q--){
register int op=in(),x=in(),ad;
if (op^){
ad=in();if (op&) A(,n,l[x],l[x],,ad);
else A(,n,l[x],r[x],,ad);
}else printf("%lld\n",query(x));
}
}
int main(){init(); solve(); return ;}
【BZOJ4034】【HAOI2015】树上操作的更多相关文章
- bzoj千题计划242:bzoj4034: [HAOI2015]树上操作
http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...
- bzoj4034[HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6163 Solved: 2025[Submit][Stat ...
- bzoj4034: [HAOI2015]树上操作(树剖)
4034: [HAOI2015]树上操作 题目:传送门 题解: 树剖裸题: 麻烦一点的就只有子树修改(其实一点也不),因为子树编号连续啊,直接改段(记录编号最小和最大) 开个long long 水模版 ...
- BZOJ4034 [HAOI2015]树上操作 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4034 题意概括 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三 ...
- BZOJ4034: [HAOI2015]树上操作
这题把我写吐了...代码水平还是太弱鸡了啊... 这题就是先给你一些点,以及点权.然后给你一些向边构成一颗树,树的根节点是1. 然后给定三个操作 第一个是把指定节点的权值+W 第二个是把指定节点X为根 ...
- BZOJ4034[HAOI2015]树上操作——树链剖分+线段树
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- [luogu3178][bzoj4034][HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- [bzoj4034][HAOI2015]树上操作——树状数组+dfs序
Brief Description 您需要设计一种数据结构支持以下操作: 把某个节点 x 的点权增加 a . 把某个节点 x 为根的子树中所有点的点权都增加 a . 询问某个节点 x 到根的路径中所有 ...
- BZOJ4034 [HAOI2015]树上操作+DFS序+线段树
参考:https://www.cnblogs.com/liyinggang/p/5965981.html 题意:是一个数据结构题,树上的,用dfs序,变成线性的: 思路:对于每一个节点x,记录其DFS ...
- bzoj4034 [HAOI2015]树上操作——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4034 树剖裸题: 一定要注意 long long !!! update 的时候别忘了 pus ...
随机推荐
- Mongodb中 Documents文档说明
mongodb使用BSON格式存储数据记录. 如下图: 文档结构 文档有键值对组成, 有以下结构: { field1: value1, field2: value2, ... ...
- cocos2d 判断旋转矩形是否包含某个点
本来想画个图演示一下,但是折腾了一会发现画不好,我的win10系统没有安装office,以后再看的话再补上吧.不废话了. 如图所以,如果判断点P是否被矩形A所包含,非常容易.那么如果矩形A以中心点逆时 ...
- lamp环境搭建经验总结
环境:centos6.4,13个源码包:参考教程高罗峰细说php思路:1.首先确定gcc,g++的安装,因为这是c语言的编译工具,没有它,源码不可能安装,redhat的yum需要配置,分为本地源和网络 ...
- Python内置函数(41)——id
英文文档: id(object) Return the "identity" of an object. This is an integer which is guarantee ...
- 关于css的层叠上下文和层叠顺序问题
关于css的层叠上下文和层叠样式问题 最近在项目中遇到了一个让我欲仙欲死的问题,我给项目中的图片设置了一个淡入效果,几opacity变化,但当我在它的上面有一个定位元素时,动画结束后,定位元素居然被遮 ...
- centos7 yum相关的常用命令
[root@mini1 ~]# history |grep yum 40 yum repolist 42 cd /etc/yum.repos.d/ 49 yum clean all 50 yum re ...
- JavaScript的sleep实现--Javascript异步编程学习
一.原始需求 最近在做百度前端技术学院的练习题,有一个练习是要求遍历一个二叉树,并且做遍历可视化即正在遍历的节点最好颜色不同 二叉树大概长这个样子: 以前序遍历为例啊, 每次访问二叉树的节点加个sle ...
- Debian8搭建LEMP环境
LEMP环境指的是Linux+Nginx+MariaDB+PHP 这里我选择的版本是最新的MariaDB和PHP7 安装Nginx 相对于Apache,Nginx是一个轻量级的高性能web服务器并在近 ...
- POJ-3617 Best Cow Line---字符串贪心
题目链接: https://vjudge.net/problem/POJ-3617 题目大意: 每次都可以从字符串的首部或者尾部提取字母,使得最后的字符串的字典序最小. 思路: 贪心做即可~每次从上和 ...
- 优易软件-关于click事件在苹果手机失效的问题
因为是动态添加的内容,所以想要使用click事件,需要给他用on绑定一下: $(document).on("click",".next_button",func ...