题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372

和 bzoj 3070 震波 是一个套路。注意区间修改的话,树状数组不能表示 dis = 0 的位置,所以要手动改父亲的点权数组。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. #define ll long long
  6. using namespace std;
  7. const int N=1e5+,K=;
  8. int n,w[N],hd[N],xnt,to[N<<],nxt[N<<],siz[N],rt,mn;
  9. int pre[N][K],dep[N],dis[N][K],fs[N],gs[N]; vector<ll> f[N],g[N];
  10. bool vis[N];
  11. int rdn()
  12. {
  13. int ret=;bool fx=;char ch=getchar();
  14. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  15. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  16. return fx?ret:-ret;
  17. }
  18. int Mx(int a,int b){return a>b?a:b;}
  19. int Mn(int a,int b){return a<b?a:b;}
  20. void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;}
  21. void add(int cr,int x,int k){for(x=Mn(x,fs[cr]);x;x-=(x&-x))f[cr][x]+=k;}
  22. ll qry(int cr,int x){ll ret=;for(;x&&x<=fs[cr];x+=(x&-x))ret+=f[cr][x];return ret;}
  23. void addx(int cr,int x,int k){for(x=Mn(x,gs[cr]);x;x-=(x&-x))g[cr][x]+=k;}
  24. ll qryx(int cr,int x){ll ret=;for(;x&&x<=gs[cr];x+=(x&-x))ret+=g[cr][x];return ret;}
  25. void getrt(int cr,int fa,int s)
  26. {
  27. siz[cr]=;int mx=;
  28. for(int i=hd[cr],v;i;i=nxt[i])
  29. if(!vis[v=to[i]]&&v!=fa)
  30. {
  31. getrt(v,cr,s);siz[cr]+=siz[v];mx=Mx(mx,siz[v]);
  32. }
  33. mx=Mx(mx,s-siz[cr]); if(mx<mn)mn=mx,rt=cr;
  34. }
  35. void dfs(int cr,int fa,int ds)
  36. {
  37. pre[cr][++dep[cr]]=rt;dis[cr][dep[cr]]=ds;
  38. for(int i=hd[cr],v;i;i=nxt[i])
  39. if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,ds+);
  40. }
  41. void init(int cr,int s)
  42. {
  43. vis[cr]=;fs[cr]=mn;gs[cr]=(mn<<)+;
  44. f[cr].resize(fs[cr]+);g[cr].resize(gs[cr]+);
  45. dfs(cr,,);
  46. for(int i=hd[cr],v;i;i=nxt[i])
  47. if(!vis[v=to[i]])
  48. {
  49. int ts=(siz[v]<siz[cr]?siz[v]:s-siz[cr]);
  50. mn=N;getrt(v,cr,ts);init(rt,ts);
  51. }
  52. }
  53. void mdfy(int cr,int d,int k)
  54. {
  55. add(cr,d,k); w[cr]+=k;
  56. for(int i=dep[cr]-;i;i--)
  57. {
  58. if(dis[cr][i]>d)continue;
  59. add(pre[cr][i],d-dis[cr][i],k); w[pre[cr][i]]+=k;/////
  60. addx(pre[cr][i+],d-dis[cr][i],k);
  61. }
  62. }
  63. ll query(int cr)
  64. {
  65. ll ret=w[cr];
  66. for(int i=dep[cr]-;i;i--)
  67. {
  68. ret+=qry(pre[cr][i],dis[cr][i]);
  69. ret-=qryx(pre[cr][i+],dis[cr][i]);
  70. }
  71. return ret;
  72. }
  73. int main()
  74. {
  75. n=rdn(); int Q=rdn();
  76. for(int i=,u,v;i<n;i++)
  77. u=rdn(),v=rdn(),add(u,v),add(v,u);
  78. mn=N;getrt(,,n);init(rt,n);
  79. int x,d,k;char ch[];
  80. while(Q--)
  81. {
  82. scanf("%s",ch);x=rdn();
  83. if(ch[]=='Q')printf("%lld\n",query(x));
  84. else
  85. {
  86. d=rdn(); k=rdn(); mdfy(x,d,k);
  87. }
  88. }
  89. return ;
  90. }

bzoj 4372 烁烁的游戏——动态点分治+树状数组的更多相关文章

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 本以为和 bzoj3730 一样,可以直接双倍经验了: 但要注意一下,树状数组不能查询 ...

  2. bzoj 4372: 烁烁的游戏 动态点分治_树链剖分_线段树

    [Submit][Status][Discuss] Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳 ...

  3. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

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

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

  5. HDU 4918 Query on the subtree(动态点分治+树状数组)

    题意 给定一棵 \(n\) 个节点的树,每个节点有点权.完成 \(q\) 个操作--操作分两种:修改点 \(x\) 的点权.查询与 \(x\) 距离小于等于 \(d\) 的权值总和. \(1 \leq ...

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

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

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

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

  8. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

  9. luogu 5311 [Ynoi2011]D1T3 动态点分治+树状数组

    我这份代码已经奇怪到一定程度了~ 洛谷上一直 $TLE$,但是本地造了几个数据都过了. 简单说一下题解: 先建出来点分树. 对于每一个询问,在点分树中尽可能向上跳祖先,看是否能够处理这个询问. 找到最 ...

随机推荐

  1. MFC读写EXIF信息,图片非占用

    MFC读写EXIF信息 读取有类库可以直接调用,网络上有直接可以用的:但是写Exif的资料非常少,我花了一点时间研究收集,终于成功. 将相关的资料共享.主要是借助gdi+,需要注意的地方很多   // ...

  2. 20155201 2016-2017-2《Java程序设计》课程总结

    20155201 2016-2017-2<Java程序设计>课程总结 目录 一.每周作业链接汇总 二.实验报告链接汇总 三.代码托管链接 四.课堂项目实践 五.课程收获与不足 六.问卷调查 ...

  3. mysql绑定参数bind_param原理以及防SQL注入

    假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aa ...

  4. artTemplate 模板使用

    下载github中文件,浏览器引用lib/template-web.js 模板html: {{each ProductInfoList as prd}} <div class="res ...

  5. 【熊猫TV】《程序员》:聚光灯下的熊猫TV技术架构演进

    2015年开始的百播大战,熊猫TV是其中比较特别的一员. 说熊猫TV是含着金钥匙出生的公子哥不为过.还未上线,就频频曝光,科技号,微博稿,站上风口浪尖.内测期间更是有不少淘宝店高价倒卖邀请码,光内测时 ...

  6. 添加 LogCat 到Eclipse

    当你第一次在 Eclipse 中运行 Android 项目的时候,Eclipse 会提醒你一次是否要添加 LogCat 这个工具. 如果你现在还没有添加上的话,我这里教你一下如何手动添加 LogCat ...

  7. 定义 S4 类

    S3 类仅用一个字符向量表示,与之不同的是,S4 类要求对类和方法有正式定义.为了定义一个 S4 类,我们需要调用 setClass( ),并提供一种类成员的表示,这种表示被称为字段(slots).通 ...

  8. 使用dos2unix批量转换文件

    使用dos2unix批量转换文件 dos2unix是Linux下的一个用户转换格式的程序,由于windows上文件的结束符和linux上的不同,那么在windows上编写的文件或者是脚本在Linux上 ...

  9. Facade(外观)

    意图: 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性: 当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不断演化而变 ...

  10. <<网络是怎样连接的>>笔记第一章browser生成message

    网络:由负责搬运数字信息的机制 + 浏览器和服务器这些网络应用程序. web->协议栈,网卡->交换机,路由器->接入网,网络运营商->(防火墙,缓存服务器)->web服 ...