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. 【BZOJ 4198】[Noi2015]荷马史诗 哈夫曼编码

    合并果子加强版....... 哈夫曼树是一种特别的贪心算法,它的作用是使若干个点合并成一棵树,每次合并新建一个节点连接两个合并根并形成一个新的根,使叶子节点的权值乘上其到根的路径长的和最短(等价于每次 ...

  2. CMU Bomblab 答案

    室友拉我做的... http://csapp.cs.cmu.edu/3e/labs.html Border relations with Canada have never been better. ...

  3. Android百度地图的使用

    做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一.申请AK(API Key) ...

  4. JAVA 成员访问权限修饰符

    修饰符         类内部     package内         子类         其他 public             允许         允许                 ...

  5. JetbrainsCrack

    http://blog.csdn.net/lcyong_/article/details/61205672 http://blog.csdn.net/nn_jbrs/article/details/7 ...

  6. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居——排序+贪心+set

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l ...

  7. 02-更改窗口的根控制器 Demo示例程序源代码

      源代码下载链接:02-更改窗口的根控制器.zip18.0 KB // MJAppDelegate.h // //  MJAppDelegate.h //  02-更改窗口的根控制器 // //  ...

  8. POJ 1002 487-3279 (map )

    title: 487-3279 map POJ1002 tags: [map] 题目链接 Description Businesses like to have memorable telephone ...

  9. exec,eval

    一.什么是Exec语句 假如我们一串字符串里面有Python代码,这个时候,普通情况是会把这串代码作为字符串来输出的,而不会执行这段代码.如果此时,我们想执行这串字符串里面的python代码,使用Ex ...

  10. mac air 装ubuntu16.04

    前言 我的mac air购于14年,128GB款.最开始我只是在OS X系统里留出了70GB给ubuntu,然后通过u盘装了ubuntu 14.04,后来又陆续将系统升级到15.04.16.04.各方 ...