[BZOJ 4034] 树上操作
Link:
Solution:
树剖模板题……
Code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
#define mid ((l+r)>>1)
#define lc k<<1,l,mid
#define rc k<<1|1,mid+1,r
const int MAXN=1e5+;
struct edge{int to,nxt;}e[MAXN<<];
ll seg[MAXN<<],tag[MAXN<<];
int n,m,x,y,head[MAXN],dep[MAXN],dat[MAXN],sz[MAXN],top[MAXN],pos[MAXN],f[MAXN],cnt,tot; void add_edge(int from,int to)
{e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;} void dfs1(int x)
{
sz[x]=;
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==f[x]) continue;
f[e[i].to]=x;dep[e[i].to]=dep[x]+;
dfs1(e[i].to);sz[x]+=sz[e[i].to];
}
} void dfs2(int x,int up)
{
int bs=;top[x]=up;pos[x]=++cnt;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=f[x]&&sz[e[i].to]>sz[bs]) bs=e[i].to;
if(!bs) return;
dfs2(bs,up);
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=f[x]&&e[i].to!=bs) dfs2(e[i].to,e[i].to);
} void pushdown(int k,int l,int r)
{
if(!tag[k]) return;
tag[k<<]+=tag[k];tag[k<<|]+=tag[k];
seg[k<<]+=tag[k]*(mid-l+);
seg[k<<|]+=tag[k]*(r-mid);
tag[k]=;
} void Update(int a,int b,int x,int k,int l,int r)
{
if(a<=l&&r<=b)
{seg[k]+=1ll*x*(r-l+);tag[k]+=x;return;} pushdown(k,l,r);
if(a<=mid) Update(a,b,x,lc);
if(b>mid) Update(a,b,x,rc);
seg[k]=seg[k<<]+seg[k<<|];
} ll Query(int a,int b,int k,int l,int r)
{
if(a<=l&&r<=b) return seg[k];
ll ret=;pushdown(k,l,r);
if(a<=mid) ret+=Query(a,b,lc);
if(b>mid) ret+=Query(a,b,rc);
return ret;
} ll solve_query(int a,int b)
{
ll ret=;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]]) swap(a,b);
ret+=Query(pos[top[a]],pos[a],,,n);
a=f[top[a]];
}
if(pos[a]>pos[b]) swap(a,b);
ret+=Query(pos[a],pos[b],,,n);
return ret;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),add_edge(x,y),add_edge(y,x);
dfs1();dfs2(,);
for(int i=;i<=n;i++) Update(pos[i],pos[i],dat[i],,,n); while(m--)
{
int op,x,a;scanf("%d%d",&op,&x);
if(op!=) scanf("%d",&a);
if(op==) Update(pos[x],pos[x],a,,,n);
else if(op==) Update(pos[x],pos[x]+sz[x]-,a,,,n);
else printf("%lld\n",solve_query(,x));
}
return ;
}
[BZOJ 4034] 树上操作的更多相关文章
- BZOJ 4034 树上操作(树的欧拉序列+线段树)
刷个清新的数据结构题爽一爽? 题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...
- bzoj 4034: 树上操作 线段树
题目: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- BZOJ 4034"树上操作"(DFS序+线段树)
传送门 •题意 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的 ...
- 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]树上操作
[HAOI2015]树上操作 传送门 题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和. 题解:树链剖分 操作1 ...
- bzoj千题计划242:bzoj4034: [HAOI2015]树上操作
http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...
- 4034: [HAOI2015]树上操作
4034: [HAOI2015]树上操作 链接 思路: 树链剖分.操作:单点修改,路径查询,子树修改. 代码: #include<cstdio> #include<algorithm ...
随机推荐
- Eclipse中的引用项目报Could not find *.apk!解决办法
百度上很多关于Could not find *.apk!这种编译报错的解决帖子,但是笔主在这里主要说一下在 引用工程项目的场景 下报这个错误消息的问题(不影响本项目的正常编译运行!). 笔主刚从谷歌上 ...
- mysql共享表空间和独立表空间
innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等. 对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 什么是共享表空间和独占表空间 共享 ...
- HDU3338:Kakuro Extension(最大流)
Kakuro Extension Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 解决设置了background-size: cover; 但是图片在ios下显示不完整的问题
设置 background-size: % 99.9%:
- javascript中的递增递减操作符
javascript中递增递减属于一元操作符,所谓一元操作符,即只能操作一个值的操作符. 递增和递减操作符各有两个版本:前置型和后置型.顾名思义,前置型应该位于要操作的变量之前,而后置型应该位于要操作 ...
- 正则表达式 re模块 collections模块
根据手机号码一共11位并且是只以13.14.15.18开头的数字这些特点,我们用python写了如下代码: while True: phone_number = input('please input ...
- Apache服务器
Apache服务器 一 简介 1 www:world wide web 万维网 http 协议: 超文本传输协议 HTML语言: 超文本标识语言 2 URL:统一资源定位 ...
- locust===注意事项
1.安装包在:微盘 2.运行命令是:locust -f load_test.py --host=https://www.baidu.com 3.本地打开的是:http://localhost:8089 ...
- LINUX环境下的GUN MAKE学习笔记(二)
第三章:makefile总述 3.1makefile的内容 在一个完整的makefile中,包含显示规则.隐含规则.变量定义.指示符和注释.下面讨论一些基本概念: 显示规则:它描述了在何种情况下如何更 ...
- ANSI、ASCII、Unicode和UTF-8编码
来自:http://blog.163.com/yang_jianli/blog/static/161990006201371451851274/ --------------------------- ...