震波

Time Limit: 15 Sec  Memory Limit: 256 MB
Submit: 1573  Solved: 358
[Submit][Status][Discuss]

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

HINT

1<=N,M<=100000

1<=u,v,x<=N

1<=value[i],y<=10000

0<=k<=N-1

Source

题解:先建立点分树

ra :表示该节点点分树子树内到其距离为某值的所有节点的权值和

rb:示该节点点分树子树内到其父亲节点距离为某值的所有节点的权值和

另一个问题:如何快速求出两点间距离?使用RMQLCA,预处理后 O(1) 查询LCA深度即可。

然后就是类似是容斥吧,维护即可。

修改的话就是计算delta,来解决。

每次不管怎么样,log层,每层的线段树上解决,

n log n是极限,所以可以认为是 n log^2n的时间复杂度。

然后就可以解决了,线段树的基本操作吧。

 #include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio> #define N 100007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,lastans,S,tot,xj;
int cnt,hed[N],rea[N*],nxt[N*];
int pos[N],mn[][N*],dep[N];
int value[N],vis[N],sz[N],fa[N],ra[N],rb[N],rt,f[N],Log[N*];
int ls[N*],rs[N*],sum[N*],tp; void add(int u,int v)
{
nxt[++cnt]=hed[u];
hed[u]=cnt;
rea[cnt]=v;
}
void get_root(int u,int fa)
{
sz[u]=,f[u]=;
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (vis[v]||v==fa)continue;
get_root(v,u),sz[u]+=sz[v],f[u]=max(f[u],sz[v]);
}
f[u]=max(f[u],S-sz[u]);
if (f[u]<f[rt])rt=u;
}
inline int dis(int x,int y)
{
int t=dep[x]+dep[y],k;
x=pos[x],y=pos[y];
if (x>y)swap(x,y);
k=Log[y-x+];
return t-(min(mn[k][x],mn[k][y-(<<k)+])<<);
}
void update(int p,int a,int l,int r,int &x)
{
if (!x)x=++xj;
sum[x]+=a;
if (l==r)return;
int mid=(l+r)>>;
if (p<=mid)update(p,a,l,mid,ls[x]);
else update(p,a,mid+,r,rs[x]);
}
int query(int p,int l,int r,int x)
{
if (!x) return ;
if (l==r) return sum[x];
int mid=(l+r)>>;
if (p<=mid)return query(p,l,mid,ls[x]);
else return query(p,mid+,r,rs[x])+sum[ls[x]];
}
void calc(int u,int par,int p)
{
update(dis(u,p),value[u],,n-,ra[p]);
if (fa[p])update(dis(u,fa[p]),value[u],,n-,rb[p]);
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (vis[v]||v==par) continue;
calc(v,u,p);
}
}
void divide(int u)
{
calc(u,,u),vis[u]=;int yS=S;
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (vis[v])continue;
rt=;
if (sz[v]>sz[u])S=yS-sz[u];
else S=sz[v];
get_root(v,),fa[rt]=u;
divide(rt);
}
}
inline void modify(int x,int y)
{
for (int i=x;i!=;i=fa[i])
{
update(dis(x,i),y-value[x],,n-,ra[i]);
if (fa[i])update(dis(x,fa[i]),y-value[x],,n-,rb[i]);
}
value[x]=y;
}
inline int solve(int x,int p)
{
int res=;
for (int i=x;i!=;i=fa[i])
{
if (dis(x,i)<=p)res+=query(p-dis(x,i),,n-,ra[i]);
if (fa[i]&&dis(x,fa[i])<=p)res-=query(p-dis(x,fa[i]),,n-,rb[i]);
}
return res;
}
void dfs(int u,int par)
{
pos[u]=++tot,mn[][tot]=dep[u];
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (v==par) continue;
dep[v]=dep[u]+,dfs(v,u),mn[][++tot]=dep[u];
}
}
int main()
{
memset(hed,-,sizeof(hed)); n=read(),m=read();
for (int i=;i<=n;i++)
value[i]=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
add(x,y),add(y,x);
}
dfs(,);
for (int i=;i<=tot;i++)Log[i]=Log[i>>]+;
for (int i=;(<<i)<=tot;i++)
for (int j=;j<=tot-(<<i)+;j++)
mn[i][j]=min(mn[i-][j],mn[i-][j+(<<(i-))]);
f[]=<<,S=n;
get_root(,),divide(rt);
while(m--)
{
int flag=read(),x=read()^lastans,y=read()^lastans;
if (flag)modify(x,y);
else printf("%d\n",lastans=solve(x,y));
}
}

bzoj3730 [震波][动态树分治+线段树+LCA]的更多相关文章

  1. BZOJ3730震波——动态点分治+线段树(点分树套线段树)

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

  2. 【bzoj3730】震波 动态点分治+线段树

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

  3. bzoj3730 震波 [动态点分治,树状数组]

    传送门 思路 如果没有强制在线的话可以离线之后CDQ分治随便搞. 有了强制在线之后--可能可以二维线段树?然而我不会算空间. 然后我们莫名其妙地想到了动态点分治,然后这题就差不多做完了. 点分树有一个 ...

  4. BZOJ 4372/3370 烁烁的游戏/震波 (动态点分治+线段树)

    烁烁的游戏 题目大意: 给你一棵$n$个节点的树,有$m$次操作,询问某个节点的权值,或者将与某个点$x$距离不超过$d$的所有节点的权值都增加$w$ 动态点分裸题 每个节点开一棵权值线段树 对于修改 ...

  5. 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树

    题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...

  6. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...

  7. 【bzoj4372】烁烁的游戏 动态点分治+线段树

    题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权.M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m接下来的n-1 ...

  8. UVALive 7148 LRIP【树分治+线段树】

    题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...

  9. BZOJ4372烁烁的游戏——动态点分治+线段树(点分树套线段树)

    题目描述 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠.皮皮鼠会被 ...

  10. [bzoj4372] 烁烁的游戏 [动态点分治+线段树+容斥原理]

    题面 传送门 思路 观察一下题目,要求的是修改"距离点$u$的距离一定的点权值",那这个就不能用传统的dfs序类算法+线段树维护,因为涉及到向父亲回溯的问题 看到和树上距离相关的东 ...

随机推荐

  1. Android颜色选择器介绍

    使用Android的颜色选择器可以让我们的view在不同状态下显示不同的颜色. 1.Android中ListView 选择某项改变该行字体颜色 2.文件位置 res/color/filename.xm ...

  2. 使用FontDialog组件设置字体

    实现效果: 知识运用: FontDialog组件的Font属性 //获取或设置选定的字体 public Font Font  { get;set; } 实现代码: private void butto ...

  3. java子父类初始化顺序 (1)父类静态代码块(2)父类静态变量初始化(3)子类静态代码块(4)子类静态变量初始化(5)main(6)有对象开辟空间都为0(7)父类显示初始化(8)父类构造(9)子类显示初始化(10)子类构造

    标题 静态代码块与静态成员变量还要看代码的先后顺序 看程序,说出结果 结果为: x=0 看程序,说出结果 结果如下: 补充 : 静态代码块:static{ } 在JVM加载时即执行,先于主方法执行,用 ...

  4. sql规范

    (一) 建表规约 -------------- 1. [强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint( 1表示是,0表示否). > 说明 ...

  5. MySQL8.0.12安装及配置

    一.下载 下载页面http://dev.mysql.com/downloads/mysql/ 选择系统平台后,点击download(根据系统选择64或32位) 二.配置 1.下载成功后,解压安装包到要 ...

  6. GoF23种设计模式之行为型模式之模板方法

    概述 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 适用性 1.一次性实现一个算法的不变的部分, ...

  7. 搭建基于金山快盘的Git服务器

    最近迷上了Git,这货堪称神器,用了它就再也不想用其他VCS了,就像上了高速就不想再走国道一样. 一般人使用Git+Github来搭建进行本地远程交互,不过Github弄个私人仓库是要刀乐思的,如果你 ...

  8. Alpha版(内部测试版)发布

    首先通过微信扫吗下载我们的软件校园服务,首先进去登录界面没账号点击注册,注册完就可以登录了,进去界面我们在二手交易这项功能里我们即可以事卖家又可以是买家如果我们卖东西点击商品出售,填写商品信息,商品图 ...

  9. loj2275 「JXOI2017」颜色

    枚举右端点,然后看左端点合法情况. 先预处理每个颜色 \(i\) 的最大出现位置 \(max_i\) 和最小出现位置 \(min_i\).对于枚举右端点在一个位置 \(i\),凡是 \(max_k & ...

  10. luogu2765 魔术球问题

    发现好像没人来证明贪心啊--那我来写一下它的证明 欲证明:放一个数在已有的柱上(如果可以)总是比新开一个柱更优的 假如已经放了x1..x2....xu..xv..xw.... 现在我要放xx 我有两种 ...