Description

在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]。
不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的价值也往往会发生变动。
接下来你需要在线处理M次操作:
0 x k 表示发生了一次地震,震中城市为x,影响范围为k,所有与x距离不超过k的城市都将受到影响,该次地震造成的经济损失为所有受影响城市的价值和。
1 x y 表示第x个城市的价值变成了y。
为了体现程序的在线性,操作中的x、y、k都需要异或你程序上一次的输出来解密,如果之前没有输出,则默认上一次的输出为0。

Input

第一行包含两个正整数N和M。
第二行包含N个正整数,第i个数表示value[i]。
接下来N-1行,每行包含两个正整数u、v,表示u和v之间有一条无向边。
接下来M行,每行包含三个数,表示M次操作。

Output

包含若干行,对于每个询问输出一行一个正整数表示答案。

Sample Input

8 1
1 10 100 1000 10000 100000 1000000 10000000
1 2
1 3
2 4
2 5
3 6
3 7
3 8
0 3 1

Sample Output

11100101
 
 
点分,每个重心按距离建一颗线段树记录该块内的城市价值。
另外多建一颗去重线段树,表示该块内从重心的某个儿子的子树内的城市价值。(去重线段树合并起来就是原线段树)
每个节点都连一条新边到深度更浅的重心。
修改时遍历一发连的新边,在更浅的重心的线段树及去重线段树处暴力修改。
查询时同样遍历所有新边,然后累计和去重。
码了好久……
 
#include<cstdio>
#include<algorithm>
#define MN 200001
using namespace std;
int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
struct na{
int x,y,z,ne;
}b[],bb[];
struct tree{
int l,r,k;
}t[];
int n,m,ma,la[MN],num=,fa[MN],s[MN],size,root,va[MN],nm=,ro[MN],lo[MN],op[MN],rot[MN],uu,nnmm=,lla[MN],nnum=;
bool v[MN];
const int INF=1e9;
inline void in(int x,int y){b[++num].y=y;b[num].ne=la[x];la[x]=num;}
inline void in(int u,int x,int y,int z){bb[++nnum].x=x;bb[nnum].y=y;bb[nnum].z=z;bb[nnum].ne=lla[u];lla[u]=nnum;}
inline void in(int &p,int l,int r,int x,int k){if (!p) p=++nm;t[p].k+=k;if (l==r) return;int mid=l+r>>;if (x<=mid) in(t[p].l,l,mid,x,k);else in(t[p].r,mid+,r,x,k);}
inline int que(int p,int l,int r,int x){if (!p||x<l) return ;if (x==r) return t[p].k;int mid=l+r>>;if (x<=mid) return que(t[p].l,l,mid,x);else return que(t[p].l,l,mid,mid)+que(t[p].r,mid+,r,x);}
inline void gs(int x,int f){
int u=;s[x]=;
for (int i=la[x];i;i=b[i].ne)
if (!v[b[i].y]&&b[i].y!=f) gs(b[i].y,x),s[x]+=s[b[i].y],u=u>s[b[i].y]?u:s[b[i].y];
if (u<size-s[x]) u=size-s[x];
if (u<ma) root=x,ma=u;
}
inline void dfs(int x,int f,int dis){
if (dis==) uu=++nnmm;
if (f) in(ro[root],,n,dis,va[x]),in(rot[uu],,n,dis,va[x]),in(x,root,uu,dis);
for (int i=la[x];i;i=b[i].ne)
if (b[i].y!=f&&(!v[b[i].y])) dfs(b[i].y,x,dis+);
}
inline void work(int x,int siz,int f){
size=siz;ma=INF;gs(x,);dfs(root,,);x=root;v[root]=;
for (int i=la[x];i;i=b[i].ne)
if (!v[b[i].y]) work(b[i].y,s[b[i].y],x);
}
inline int qu(int x,int k){
int ans=que(ro[x],,n,k)+va[x];
for (register int j=lla[x];j;j=bb[j].ne){if (k>=bb[j].z) ans+=va[bb[j].x];ans+=que(ro[bb[j].x],,n,k-bb[j].z)-que(rot[bb[j].y],,n,k-bb[j].z);}
return ans;
}
int main(){
int x,y,z;register int j;
n=read();m=read();
for (int i=;i<=n;i++) va[i]=read();
for (int i=;i<n;i++) x=read(),y=read(),in(x,y),in(y,x);
work(,n,);
int la=;
while(m--){
x=read();y=read();z=read();y^=la;z^=la;
if (x){
z-=va[y];
for (register int j=lla[y];j;j=bb[j].ne)
in(ro[bb[j].x],,n,bb[j].z,z),in(rot[bb[j].y],,n,bb[j].z,z);
va[y]+=z;
}
else printf("%d\n",la=qu(y,z));
}
}

222832KB . 10736MS . C++ . 2552B

bzoj:3730: 震波的更多相关文章

  1. bzoj 3730 震波——动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f ...

  2. bzoj 3730 震波 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 建点分树,每个点记两个树状数组,存它作为重心管辖的范围内,所有点到它的距离情况和到它在 ...

  3. bzoj 3730 震波 (动态点分治)

    大意: 给定n节点树, 每个节点有权值, 边权全为1. 给定m个操作: 操作1: (0,x,k) 表示询问到节点x距离不超过k的节点权值和 操作2: (1,x,y) 表示将节点x的权值修改为y 对于所 ...

  4. bzoj 3730: 震波 动态点分治_树链剖分_线段树

    ##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...

  5. 【BZOJ】3730: 震波

    原题链接 题解 查询距离一个点距离在一定范围内的点,直接点分树,前缀和用树状数组维护 答案是当前重心距离不超过k - (x到重心距离)的点的前缀和,减去在x所在子树中,距离重心不超过k - (x到重心 ...

  6. BZOJ -3730(动态点分治)

    题目:在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的 ...

  7. BZOJ3730 震波 和 BZOJ4372 烁烁的游戏

    "震波"题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  autoint Log ...

  8. 【BZOJ-3730】震波 动态点分治 + 树状数组

    3730: 震波 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 626  Solved: 149[Submit][Status][Discuss] D ...

  9. bzoj 4372 烁烁的游戏——动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 和 bzoj 3070 震波 是一个套路.注意区间修改的话,树状数组不能表示 dis ...

随机推荐

  1. SPARQL查询语言

    SPARQL的查询是基于结构化知识的,变无序数据为有序知识,让计算机理解Web信息,即语义Web.现如今,语义网适用于各个领域,包括语义出版.语义知识库等.SPARQL是针对以RDF框架进行存储的知识 ...

  2. Principle-初步认识(简介)

    Principle官网 探究了一下 . 呃--作出了下边这玩意 做的好的是这样的,瞬间把自己给菜了,给大家看看,设计需要UI功夫啊 把这个用上你的界面就搞基了,图形在水平.垂直上的动态效果(*.*) ...

  3. iOS知识点、面试题 之二

    最近面试,与大家分享一下,分三文给大家: 当然Xcode新版本区别,以及iOS新特性 Xcode8 和iOS 10 在之前文章有发过,感兴趣的可以查阅: http://www.cnblogs.com/ ...

  4. ReactNative布局样式总结

    flex number 用于设置或检索弹性盒模型对象的子元素如何分配空间 flexDirection enum('row', 'row-reverse' ,'column','column-rever ...

  5. [置顶] bootstrap自定义样式-bootstrap侧边导航栏的实现

    前言 bootstrap自带的响应式导航栏是向下滑动的,有时满足不了个性化的需求,需要做一个类似于android drawerLayout 侧滑的菜单,这就是我要实现的bootstrap自定义侧滑菜单 ...

  6. python学习中的一些“坑”

    一.交互列表元素时,需要注意的坑. 例如: array=[4,5,9,8,10,8,4,0,3,4]  最大的值与第一个元素交换,最小的值与最后一个元素交换 # -*- coding: UTF-8 - ...

  7. MySQL字符串相关函数学习一

    这里总结一下常用的或者有可能用到的一些字符串内建函数 ① ASCII() :返回字符的ASCII码 如果输入的不是一个字符而是一个字符串呢?ascii()会只取第一个字符作为计算的参数,如: ② CH ...

  8. Python Tkinter模块 Grid(grid)布局管理器参数详解

    在使用Tkinter模块编写图像界面时,经常用到pack()和grid()进行布局管理,pack()参数较少,使用方便,是最简单的布局,但是当控件数量较多时,可能需要使用grid()进行布局(不要在同 ...

  9. postfix : 452 4.3.1 Insufficient system storage

    postfix Error Message: 452 4.3.1 Insufficient system storage --> 空间不足. 但是实际情况是我的各个分区都没有满,只是我的20G ...

  10. [js高手之路]面向对象版本匀速运动框架

    这篇文章的效果,需要看过以下3篇文章: [js插件开发教程]一步步开发一个可以定制配置的隔行变色小插件 [js高手之路]匀速运动与实例实战(侧边栏,淡入淡出) [js高手之路]打造通用的匀速运动框架 ...