BZOJ -3730(动态点分治)
题目:在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]。
不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的价值也往往会发生变动。
接下来你需要在线处理M次操作:
0 x k 表示发生了一次地震,震中城市为x,影响范围为k,所有与x距离不超过k的城市都将受到影响,该次地震造成的经济损失为所有受影响城市的价值和。
1 x y 表示第x个城市的价值变成了y。
为了体现程序的在线性,操作中的x、y、k都需要异或你程序上一次的输出来解密,如果之前没有输出,则默认上一次的输出为0。
思路:点分树,动态维护一个重心的信息。 这里维护的是点到其他点的某距离下的权值和。 注意处理重复信息。
时间卡得有点紧,ST表求LCA,没树剖快。。。居然?
线段树没树状数组快,这个可以理解,关键是在于怎么开点,不会炸空间--------把空间和点分树的对应起来O(NlogN)就可以了。
(T了很多次,也改(抄)了不少写法,日后再来补。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define RG register
#define MAX 111111
inline int read()
{
RG int x=,t=;RG char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')t=-,ch=getchar();
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*t;
}
int n,m,V[MAX];
struct Line{int v,next;}e[MAX<<];
int h[MAX],cnt=;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
/********************************************************************/
/*int size[MAX],dfn[MAX],top[MAX],dep[MAX],fa[MAX],tim,hson[MAX];
void dfs1(int u,int ff)
{
fa[u]=ff;size[u]=1;dep[u]=dep[ff]+1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs1(v,u);size[u]+=size[v];
if(size[v]>size[hson[u]])hson[u]=v;
}
}
void dfs2(int u,int tp)
{
top[u]=tp;
if(hson[u])dfs2(hson[u],tp);
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=fa[u]&&e[i].v!=hson[u])
dfs2(e[i].v,e[i].v);
}
int LCA(int u,int v)
{
while(top[u]^top[v])dep[top[u]]<dep[top[v]]?v=fa[top[v]]:u=fa[top[u]];
return dep[u]<dep[v]?u:v;
}
int Dis(int u,int v){return dep[u]+dep[v]-2*dep[LCA(u,v)];}*/
bool vis[MAX];
int ver[MAX<<],first[MAX<<],dept[MAX<<],Tot;
int dp[MAX<<][],dep[MAX<<];
void dfs(int u ,int d)
{
vis[u]=true;
ver[++Tot] = u;
first[u] = Tot;
dept[Tot] = d; dep[u]=d;
for(int i=h[u];i;i=e[i].next)
if( !vis[e[i].v] )
{
dfs(e[i].v,d+);
ver[++Tot] = u;
dept[Tot] = d;
}
} void ST(int N)
{
for(int i=;i<=N;i++) dp[i][] = i;
for(int j=;(<<j)<=N;j++)
{
for(int i=;i+(<<j)-<=N;i++)
{
int a = dp[i][j-] , b = dp[i+(<<(j-))][j-];
dp[i][j] = dept[a]<dept[b]?a:b;
}
}
}
int lg2[MAX<<];
int RMQ(int l,int r)
{
int k=;
//while((1<<(k+1))<=r-l+1) k++;
k=lg2[r-l+];
int a=dp[l][k],b=dp[r-(<<k)+][k];
return dept[a]<dept[b]?a:b;
} int LCA(int u ,int v)
{
int x = first[u] , y = first[v];
int res;
if(x<=y) res = RMQ(x,y);
else res=RMQ(y,x);
//cout<<u<<" "<<v<<" : "<<ver[res]<<endl;
return ver[res];
}
int Dis(int u,int v)
{
return dep[u]+dep[v]-(dep[LCA(u,v)]<<);
}
namespace BIT{
typedef vector<int> vec;
struct BIT{
vec tree; int n;
inline void init(int size) {tree.resize(size+); n=size+;}
inline int lowbit(int x) {return x&-x;}
inline void Modify(int x,int d) {if (x<=) return; for (int i=x; i<=n; i+=lowbit(i)) tree[i]+=d;}
inline int Query(int x) {int re=; if (x>n) x=n; for (int i=x; i>; i-=lowbit(i)) re+=tree[i]; return re;}
}G[MAX<<];
}using namespace BIT;
int Fa[MAX],Size,root,mx,size[MAX];
void Getroot(int u,int ff)
{
size[u]=;int ret=;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff||vis[v])continue;
Getroot(v,u);size[u]+=size[v];
ret=max(ret,size[v]);
}
ret=max(ret,Size-size[u]);
if(ret<mx)mx=ret,root=u;
}
void DFS(int u,int ff)
{
vis[u]=true;Fa[u]=ff;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(vis[v])continue;
mx=Size=size[v];
Getroot(v,u);
G[root].init(Size); G[root+n].init(Size);
DFS(root,u);
}
}
void Modify(int x,int w)
{
G[x].Modify(,w);
for(int i=x;Fa[i];i=Fa[i])
{
int dis=Dis(x,Fa[i]);
G[Fa[i]].Modify(dis+,w);
G[i+n].Modify(dis+,w);
}
}
int Query(int x,int K)
{
int ret=G[x].Query(K+);
for(int i=x;Fa[i];i=Fa[i])
{
int dis=Dis(x,Fa[i]);if(dis>K)continue;
//ret+=Query(rt[Fa[i]],0,n,0,K-dis);
//ret-=Query(rt[i+n],0,n,0,K-dis);
ret+=G[Fa[i]].Query(K-dis+);
ret-=G[i+n].Query(K-dis+);
}
return ret;
}
/********************************************************************/
int main()
{
n=read();m=read();
for(int i=;i<=n;++i)V[i]=read();
for(int i=;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
/*dfs1(1,0);dfs2(1,1);*/
dfs(,);
ST(Tot);
lg2[]=-;
for(int i=;i<=Tot;i++) lg2[i]=lg2[i>>]+;
for(int i=;i<=n;i++) vis[i]=;
Size=mx=n;
Getroot(,); G[root].init(n); G[root+n].init(n);DFS(root,);
for(int i=;i<=n;++i) Modify(i,V[i]);
int ans=;
while(m--)
{
int opt=read(),x=read()^ans,y=read()^ans;
if(opt==)printf("%d\n",ans=Query(x,y));
else Modify(x,y-V[x]),V[x]=y;
}
return ;
}
BZOJ -3730(动态点分治)的更多相关文章
- 【BZOJ1095】捉迷藏(动态点分治)
[BZOJ1095]捉迷藏(动态点分治) 题面 BZOJ 题解 动态点分治板子题 假设,不考虑动态点分治 我们来想怎么打暴力: \(O(n)DP\)求树的最长链 一定都会.不想解释了 所以,利用上面的 ...
- 【BZOJ3730】震波(动态点分治)[复习]
题面 BZOJ 题解 动态点分治什么的完全不记得了.这回重新写一写. 首先我们把点分树给建出来. 操作只有两种,修改和询问距离某个点的距离不超过\(k\)的点的和. 两点之间的距离可以树链剖分之类的算 ...
- bzoj 3730: 震波 动态点分治_树链剖分_线段树
##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...
- BZOJ 3295 动态逆序对 | CDQ分治
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...
- BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)
这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...
- BZOJ 3435 / Luogu 3920 [WC2014]紫荆花之恋 (替罪羊树 动态点分治 套 Treap)
题意 略 分析 引用PoPoQQQ的话 吾辈有生之年终于把这道题切了...QAQ (蒟蒻狂笑) Orz PoPoQQQ,我又抄PoPoQQQ的题解了 - 突然发现有旋Treap没那么难写 学习了一波C ...
- 【BZOJ4372】烁烁的游戏(动态点分治)
[BZOJ4372]烁烁的游戏(动态点分治) 题面 BZOJ 大意: 每次在一棵书上进行操作 1.将离某个点u的距离不超过d的点的权值加上w 2.询问单点权值 题解 这题和前面那一道震波几乎是一模一样 ...
- 【BZOJ3730】震波(动态点分治)
[BZOJ3730]震波(动态点分治) 题面 BZOJ 题意 给定一棵树, 每次询问到一个点的距离\(<=K\)的点的权值之和 动态修改权值, 强制在线 题解 正常的\(DP\)??? 很简单呀 ...
- bzoj3730 震波 [动态点分治,树状数组]
传送门 思路 如果没有强制在线的话可以离线之后CDQ分治随便搞. 有了强制在线之后--可能可以二维线段树?然而我不会算空间. 然后我们莫名其妙地想到了动态点分治,然后这题就差不多做完了. 点分树有一个 ...
- BZOJ1095 [ZJOI2007]Hide 捉迷藏 动态点分治 堆
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ1095.html 题目传送门 - BZOJ1095 题意 有 N 个点,每一个点是黑色或者白色,一开始所 ...
随机推荐
- [转帖]/proc/sys目录下各文件参数说明
/proc/sys目录下各文件参数说明 https://blog.csdn.net/luteresa/article/details/68061881 一.前言 本文档针对OOP8生产环境,具体优 ...
- 如何Dockerize您的端到端验收测试
本文作为使用Selenium Docker映像以及CodeceptJS和Express服务器的“操作方法”指南. 其中,我们将涵盖: 什么是E2E验收测试? 为什么要使用Docker? 松散耦合的测试 ...
- NFS挂载参数
mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=6 192.168.12.50 ...
- 23 Collection集合常用方法讲解
本文讲讲几个Collection的常用方法,这些方法在它的子类中也是很常用的,因此这里先拿出来单独讲解,以后它的子类中的这些方法就不再重复讲解. 几个常用方法: add() 添加一个元素 size() ...
- java之mybatis之动态sql
1. if 判读条件是否满足,满足将会把 sql 语句加上. <select id="findUser" parameterType="Map" resu ...
- C# vb .net实现大小调整特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的大小调整效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- IIS err_connection_timed_out(响应时间过长)
场景:我在服务器的IIS上部署了一个网站,服务器上可以正常打开,然后我用自己的电脑访问,出现如下错误: 原因:服务器的防火墙对入站规则进行了一些限制. 解决方法:1.打开服务器的防火墙-----> ...
- mybatis使用foreach处理List中的Map mybatis-----传入传出多个参数,都是map或list,批量更新
https://nannan408.iteye.com/blog/2170470 https://blog.csdn.net/xingzhishen/article/details/86424395 ...
- 2019-07-25 PDO
PDO是什么? pdo是php数据对象,即php data object .使用pdo是为了让我们能够使用相同的代码连接不同的数据库.PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展 ...
- Java中new和Class.forName的区别
首先:New = Class.forName("pacage.A").newInstance(); new是关键字,直接创建对象.Class.forName()是一个方法,要求JV ...