题目:在一片土地上有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(动态点分治)的更多相关文章

  1. 【BZOJ1095】捉迷藏(动态点分治)

    [BZOJ1095]捉迷藏(动态点分治) 题面 BZOJ 题解 动态点分治板子题 假设,不考虑动态点分治 我们来想怎么打暴力: \(O(n)DP\)求树的最长链 一定都会.不想解释了 所以,利用上面的 ...

  2. 【BZOJ3730】震波(动态点分治)[复习]

    题面 BZOJ 题解 动态点分治什么的完全不记得了.这回重新写一写. 首先我们把点分树给建出来. 操作只有两种,修改和询问距离某个点的距离不超过\(k\)的点的和. 两点之间的距离可以树链剖分之类的算 ...

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

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

  4. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  5. BZOJ 3924: [Zjoi2015]幻想乡战略游戏(动态点分治)

    这种动态点分治嘛,GDKOI时听打到了,也有同学讲到了,所以印象比较深刻也就想出来了,然后就在实现方面卡了好久= = 不得不说CLJ说得真的太简单了,实现方面根本没提. 首先我们可以先用树分治构建出这 ...

  6. BZOJ 3435 / Luogu 3920 [WC2014]紫荆花之恋 (替罪羊树 动态点分治 套 Treap)

    题意 略 分析 引用PoPoQQQ的话 吾辈有生之年终于把这道题切了...QAQ (蒟蒻狂笑) Orz PoPoQQQ,我又抄PoPoQQQ的题解了 - 突然发现有旋Treap没那么难写 学习了一波C ...

  7. 【BZOJ4372】烁烁的游戏(动态点分治)

    [BZOJ4372]烁烁的游戏(动态点分治) 题面 BZOJ 大意: 每次在一棵书上进行操作 1.将离某个点u的距离不超过d的点的权值加上w 2.询问单点权值 题解 这题和前面那一道震波几乎是一模一样 ...

  8. 【BZOJ3730】震波(动态点分治)

    [BZOJ3730]震波(动态点分治) 题面 BZOJ 题意 给定一棵树, 每次询问到一个点的距离\(<=K\)的点的权值之和 动态修改权值, 强制在线 题解 正常的\(DP\)??? 很简单呀 ...

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

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

  10. BZOJ1095 [ZJOI2007]Hide 捉迷藏 动态点分治 堆

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ1095.html 题目传送门 - BZOJ1095 题意 有 N 个点,每一个点是黑色或者白色,一开始所 ...

随机推荐

  1. 如何录制高清GIF格式的图片

    如何录制高清GIF格式的图片 工具:傲软GIF 下载地址:https://www.apowersoft.cn/gif 特点:质量高,能够一帧一帧的修改 使用简单.就不说了.自行尝试.这里只是提供一个制 ...

  2. 前端中常见字节编码(base64、hex、utf8)及其转换

    /* * 字节编码转换 * 首先都需要转为二级制数组 (ArrayBuffer) * 然后才能转换对应的编码字符 * 前端常见编码: * base64:就是将二进制转为字符串,将每6个字节转为一个特定 ...

  3. MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比

    MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比一.在mybatis中ExecutorType的使用1.Mybatis内置的ExecutorType有3种,默认的是s ...

  4. 二叉树根结点到任意结点的路径(C语言)

    有一棵二叉树,如下图所示: 其中 # 表示空结点. 先序遍历:A B D E G C F 问题:怎么得到从根结点到任意结点的路径呢? 示例:输入 G,怎么得到从结点 A 到结点 G 的路径呢? 很明显 ...

  5. 解决 Url is blocked: Requests to the local network are not allowed

    问题:         我在学习GitLab + Jenkins 自动化部署时,在GitLab的 MyProject => Settings => Integrations中输入完 &qu ...

  6. ASP.NET WebApi 学习与实践系列(2)---WebApi 路由请求的理解

    目录 写在前面 WebApi Get 请求 1.无参数的请求 2.一个参数的请求 3.多个参数的请求 4.实体参数的请求 WebApi Post 请求 1.键值对请求 2.dynamic 动态类型请求 ...

  7. java之spring mvc之ajax

    1.可以使用servletAPI来实现 ajax Controller 类 @Controller public class AjaxController { @RequestMapping(&quo ...

  8. MVC视图中 TextBoxFor 数据格式化

    @Html.TextBoxFor(m => m.Birthday,"{0:yyyy-MM-dd}", new { @class = "m-wrap small&qu ...

  9. Java知识回顾 (14)网络编程

    本资料来自于runoob,略有修改. 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细 ...

  10. npm全局模块卸载及默认安装目录修改方法

    卸载全局安装模块  npm uninstall -g <package> 卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:npm ls npm ...