题目:在一片土地上有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了很多次,也改(抄)了不少写法,日后再来补。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define RG register
  5. #define MAX 111111
  6. inline int read()
  7. {
  8. RG int x=,t=;RG char ch=getchar();
  9. while((ch<''||ch>'')&&ch!='-')ch=getchar();
  10. if(ch=='-')t=-,ch=getchar();
  11. while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
  12. return x*t;
  13. }
  14. int n,m,V[MAX];
  15. struct Line{int v,next;}e[MAX<<];
  16. int h[MAX],cnt=;
  17. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
  18. /********************************************************************/
  19. /*int size[MAX],dfn[MAX],top[MAX],dep[MAX],fa[MAX],tim,hson[MAX];
  20. void dfs1(int u,int ff)
  21. {
  22. fa[u]=ff;size[u]=1;dep[u]=dep[ff]+1;
  23. for(int i=h[u];i;i=e[i].next)
  24. {
  25. int v=e[i].v;if(v==ff)continue;
  26. dfs1(v,u);size[u]+=size[v];
  27. if(size[v]>size[hson[u]])hson[u]=v;
  28. }
  29. }
  30. void dfs2(int u,int tp)
  31. {
  32. top[u]=tp;
  33. if(hson[u])dfs2(hson[u],tp);
  34. for(int i=h[u];i;i=e[i].next)
  35. if(e[i].v!=fa[u]&&e[i].v!=hson[u])
  36. dfs2(e[i].v,e[i].v);
  37. }
  38. int LCA(int u,int v)
  39. {
  40. while(top[u]^top[v])dep[top[u]]<dep[top[v]]?v=fa[top[v]]:u=fa[top[u]];
  41. return dep[u]<dep[v]?u:v;
  42. }
  43. int Dis(int u,int v){return dep[u]+dep[v]-2*dep[LCA(u,v)];}*/
  44. bool vis[MAX];
  45. int ver[MAX<<],first[MAX<<],dept[MAX<<],Tot;
  46. int dp[MAX<<][],dep[MAX<<];
  47. void dfs(int u ,int d)
  48. {
  49. vis[u]=true;
  50. ver[++Tot] = u;
  51. first[u] = Tot;
  52. dept[Tot] = d; dep[u]=d;
  53. for(int i=h[u];i;i=e[i].next)
  54. if( !vis[e[i].v] )
  55. {
  56. dfs(e[i].v,d+);
  57. ver[++Tot] = u;
  58. dept[Tot] = d;
  59. }
  60. }
  61.  
  62. void ST(int N)
  63. {
  64. for(int i=;i<=N;i++) dp[i][] = i;
  65. for(int j=;(<<j)<=N;j++)
  66. {
  67. for(int i=;i+(<<j)-<=N;i++)
  68. {
  69. int a = dp[i][j-] , b = dp[i+(<<(j-))][j-];
  70. dp[i][j] = dept[a]<dept[b]?a:b;
  71. }
  72. }
  73. }
  74. int lg2[MAX<<];
  75. int RMQ(int l,int r)
  76. {
  77. int k=;
  78. //while((1<<(k+1))<=r-l+1) k++;
  79. k=lg2[r-l+];
  80. int a=dp[l][k],b=dp[r-(<<k)+][k];
  81. return dept[a]<dept[b]?a:b;
  82. }
  83.  
  84. int LCA(int u ,int v)
  85. {
  86. int x = first[u] , y = first[v];
  87. int res;
  88. if(x<=y) res = RMQ(x,y);
  89. else res=RMQ(y,x);
  90. //cout<<u<<" "<<v<<" : "<<ver[res]<<endl;
  91. return ver[res];
  92. }
  93. int Dis(int u,int v)
  94. {
  95. return dep[u]+dep[v]-(dep[LCA(u,v)]<<);
  96. }
  97. namespace BIT{
  98. typedef vector<int> vec;
  99. struct BIT{
  100. vec tree; int n;
  101. inline void init(int size) {tree.resize(size+); n=size+;}
  102. inline int lowbit(int x) {return x&-x;}
  103. inline void Modify(int x,int d) {if (x<=) return; for (int i=x; i<=n; i+=lowbit(i)) tree[i]+=d;}
  104. 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;}
  105. }G[MAX<<];
  106. }using namespace BIT;
  107. int Fa[MAX],Size,root,mx,size[MAX];
  108. void Getroot(int u,int ff)
  109. {
  110. size[u]=;int ret=;
  111. for(int i=h[u];i;i=e[i].next)
  112. {
  113. int v=e[i].v;if(v==ff||vis[v])continue;
  114. Getroot(v,u);size[u]+=size[v];
  115. ret=max(ret,size[v]);
  116. }
  117. ret=max(ret,Size-size[u]);
  118. if(ret<mx)mx=ret,root=u;
  119. }
  120. void DFS(int u,int ff)
  121. {
  122. vis[u]=true;Fa[u]=ff;
  123. for(int i=h[u];i;i=e[i].next)
  124. {
  125. int v=e[i].v;if(vis[v])continue;
  126. mx=Size=size[v];
  127. Getroot(v,u);
  128. G[root].init(Size); G[root+n].init(Size);
  129. DFS(root,u);
  130. }
  131. }
  132. void Modify(int x,int w)
  133. {
  134. G[x].Modify(,w);
  135. for(int i=x;Fa[i];i=Fa[i])
  136. {
  137. int dis=Dis(x,Fa[i]);
  138. G[Fa[i]].Modify(dis+,w);
  139. G[i+n].Modify(dis+,w);
  140. }
  141. }
  142. int Query(int x,int K)
  143. {
  144. int ret=G[x].Query(K+);
  145. for(int i=x;Fa[i];i=Fa[i])
  146. {
  147. int dis=Dis(x,Fa[i]);if(dis>K)continue;
  148. //ret+=Query(rt[Fa[i]],0,n,0,K-dis);
  149. //ret-=Query(rt[i+n],0,n,0,K-dis);
  150. ret+=G[Fa[i]].Query(K-dis+);
  151. ret-=G[i+n].Query(K-dis+);
  152. }
  153. return ret;
  154. }
  155. /********************************************************************/
  156. int main()
  157. {
  158. n=read();m=read();
  159. for(int i=;i<=n;++i)V[i]=read();
  160. for(int i=;i<n;++i)
  161. {
  162. int u=read(),v=read();
  163. Add(u,v);Add(v,u);
  164. }
  165. /*dfs1(1,0);dfs2(1,1);*/
  166. dfs(,);
  167. ST(Tot);
  168. lg2[]=-;
  169. for(int i=;i<=Tot;i++) lg2[i]=lg2[i>>]+;
  170. for(int i=;i<=n;i++) vis[i]=;
  171. Size=mx=n;
  172. Getroot(,); G[root].init(n); G[root+n].init(n);DFS(root,);
  173. for(int i=;i<=n;++i) Modify(i,V[i]);
  174. int ans=;
  175. while(m--)
  176. {
  177. int opt=read(),x=read()^ans,y=read()^ans;
  178. if(opt==)printf("%d\n",ans=Query(x,y));
  179. else Modify(x,y-V[x]),V[x]=y;
  180. }
  181. return ;
  182. }

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. (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇

    背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇

  2. 2017ACM/ICPC广西邀请赛 Color it

    Color it Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Tota ...

  3. 使用Android SDK卸载厂家程序

    ADB下载: 官网翻墙比较慢,这里推荐使用国内网站:https://www.androiddevtools.cn/ 下载  SDK Tools  和  SDK Platform-Tools: 两者分别 ...

  4. [转载]ROS开发环境之Qt Creator

    ROS开发环境之Qt Creator(http://my.phirobot.com/blog/2013-12-ros_ide_qtcreator.html) Created at: 2013-12-2 ...

  5. CF933E A Preponderant Reunion DP

    传送门 题解搬运工 设原问题为问题A.每一次减少\(\min\{p_i , p_{i+1}\}\)难以处理,我们考虑将限制变得宽松一些:每一次可以减少\([1,\min\{p_i , p_{i+1}\ ...

  6. Oracle学习笔记(四)

    Oracle中的体系结构: oracle体系结构中的进程: 共享池相关的优化: drop table t purge; create table t as select * from dba_obje ...

  7. Java jms学习

    /** * <html> * <body> * <P> https://github.com/Jasonandy </p> * <p> Al ...

  8. C# 练习题 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析: 兔子的规律为数列1,1,2,3,5,8, ...

  9. "Sed" 高级实用功能汇总

    sed命令有两个空间,一个叫pattern space,一个叫hold space.这两个空间能够证明人类的脑瓜容量是非常小的,需要经过大量的训练和烧脑的理解,才能适应一些非常简单的操作. 不信看下面 ...

  10. sqlserver 2005 数据库的差异备份与还原

    找到一个可靠的步骤,点开链接:http://blog.csdn.net/kevindr/article/details/22154323