Link:

BZOJ 4034 传送门

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] 树上操作的更多相关文章

  1. BZOJ 4034 树上操作(树的欧拉序列+线段树)

    刷个清新的数据结构题爽一爽? 题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...

  2. bzoj 4034: 树上操作 线段树

    题目: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...

  3. BZOJ 4034"树上操作"(DFS序+线段树)

    传送门 •题意 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的 ...

  4. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  5. bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4352  Solved: 1387[Submit][Stat ...

  6. bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6779  Solved: 2275[Submit][Stat ...

  7. [BZOJ]4034: [HAOI2015]树上操作

    [HAOI2015]树上操作 传送门 题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和. 题解:树链剖分 操作1 ...

  8. bzoj千题计划242:bzoj4034: [HAOI2015]树上操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...

  9. 4034: [HAOI2015]树上操作

    4034: [HAOI2015]树上操作 链接 思路: 树链剖分.操作:单点修改,路径查询,子树修改. 代码: #include<cstdio> #include<algorithm ...

随机推荐

  1. oracle大数据匹配处理C#

    忙碌了几天写出来的oracle存储过程在作业中执行. 写的oracle存储过程如果有什么不好的地方大家指点指点. oracle存储过程其中使用到游标嵌套.if.if嵌套.数据插入表.select插入表 ...

  2. org.json与json-lib的区别(补充 FastJson)

    org.json 是JSON国际组织官方推出的标准json解析方案,已经被 android sdk 纳入到标准内置类库,依赖项少,但直至API17版本SDK中,仅支持JSONObject与JSONAr ...

  3. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) B

    B. Problems for Round time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  4. POJ1182:食物链(并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 94930   Accepted: 28666 Description ...

  5. php 计算两个日期的间隔天数

    使用php内部自带函数实现 1.使用DateTime::diff 实现计算 参考阅读>>PHP DateTime::diff() 上代码: <?php $start = " ...

  6. 51Nod 1118 机器人走方格--求逆元

    (x/y) %mod =x*(y^(mod-2))%mod; 在算x,y的时候可以一直mod 来缩小 y^(mod-2)显然是个快速幂 #include <iostream> #inclu ...

  7. Logistic函数

    Logistic函数(又称sigmoid函数)        Logistic函数或Logistic曲线是一种常见的S形函数,它是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系 ...

  8. web前端 CSS基础

    简单的CSS文件 <style type="text/css"> a{ color:rebeccapurple; font-size: larger; font-wei ...

  9. SpringMvc基础知识(一)

    目录: springmvc框架原理(掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 springmvc入门程序 目的:对前端控制器.处理器映射器.处理器适配器.视图解析器学习 非注解的处理 ...

  10. linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

    转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一每 ...