【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 ...
随机推荐
- 201621123031 《Java程序设计》第7周学习总结
作业07-Java GUI编程 1.本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 事件监听器: Java事件监听器是由事件类和监听接口组成,自定义 ...
- Django 分类标签查找
from django.conf.urls import url from django.contrib import admin from blog.views import index,stude ...
- 自制 h5 音乐播放器 可搜索
闲言碎语: 有好几天没有发表博客了,这也是因为一直开发音乐和完善我的博客项目,好不容易抽出时间总结一下这几天所做的东西,笔试又不断通知,实则匆忙 今天难得逃了一次课,就趁这时间,该写写就写写吧~~ 进 ...
- intellij idea 找不到或无法加载主类
解决intellij idea 找不到或无法加载主类,请看以下图文介绍 然后idea会重启,等idea启动后 右侧的maven clean 一下,然后再compile就解决了
- 作业五:RE 模块模拟计算器
# !/usr/bin/env python3 # _*_coding:utf-8_*_ ''' 实现模拟计算器的功能: 公式: - * ( (- +(-/) * (-*/ + /*/* + * / ...
- 【漏洞复现】PHPCMS wap模块 SQL注入(附EXP)
漏洞影响版本:v9.5.8.v9.6.0 Step1: 访问:http://www.xxx.com/index.php?m=wap&a=index&siteid=1, 获取返回的coo ...
- GIT入门笔记(13)- GUI GIT
- Docker学习笔记 - Docker容器之间的连接
学习目标: 容器之间可以相互连接访问:: --link redis:redisAlias 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN ...
- Spring入门(3-1)Spring的标签命名空间
1.标签命名空间声明: 2.标签命名空间使用 标签默认的命名空间是 security:,可以不用带 security:,直接写标签,如: <http <authentication-ma ...
- [Luogu1342] 请柬 - 最短路模板
Description 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被 ...