一道奇奇怪怪的数据结构题?

把树线性化,然后分块维护吧。

为了加速,求和用树状数组维护每个块的值。

  1. #include<bits/stdc++.h>
  2. #define N 100010
  3. #define M 320
  4. using namespace std;
  5. typedef long long ll;
  6. typedef unsigned long long ull;
  7. struct Edge{int u,v,next;}G[N*];
  8. ll c[N],ans[N],val[N];
  9. int cnt,tot,head[N],block,rt,tpos[N],pos[N],size[N],num,n,m;
  10. int lx[M],rx[M],f[M][N];
  11. void addedge(int u,int v){
  12. G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
  13. G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
  14. }
  15. inline int lowbit(int x){return (x&(-x));}
  16. inline void add(int x,ll v){for(int i=x;i<=n;i+=lowbit(i))c[i]+=v;}
  17. inline ll ask(int x){
  18. ll ans=;
  19. for(int i=x;i;i-=lowbit(i))ans+=c[i];
  20. return ans;
  21. }
  22. void dfs(int u,int fa){
  23. for(int i=;i<=num;i++)f[i][u]=f[i][fa];f[pos[u]][u]++;
  24. tpos[u]=++cnt;size[u]=;
  25. add(tpos[u],val[u]);
  26. for(int i=head[u];i;i=G[i].next){
  27. int v=G[i].v;if(v==fa)continue;
  28. dfs(v,u);
  29. size[u]+=size[v];
  30. }
  31. }
  32. void change(int x,ll v){
  33. add(tpos[x],v-val[x]);
  34. for(int i=;i<=num;i++)ans[i]+=(ll)f[i][x]*(v-val[x]);
  35. val[x]=v;
  36. }
  37. ull query(int l,int r){
  38. ull ret=;
  39. for(int i=pos[l]+;i<=pos[r]-;i++)ret+=ans[i];
  40. if(pos[l]==pos[r]){
  41. for(int i=l;i<=r;i++)ret+=ask(tpos[i]+size[i]-)-ask(tpos[i]-);
  42. return ret;
  43. }
  44. if(l==lx[pos[l]])ret+=ans[pos[l]];
  45. else for(int i=l;i<=rx[pos[l]];i++)ret+=ask(tpos[i]+size[i]-)-ask(tpos[i]-);
  46. if(r==rx[pos[r]])ret+=ans[pos[r]];
  47. else for(int i=lx[pos[r]];i<=r;i++)ret+=ask(tpos[i]+size[i]-)-ask(tpos[i]-);
  48. return ret;
  49. }
  50. inline int read(){
  51. int f=,x=;char ch;
  52. do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
  53. do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
  54. return f*x;
  55. }
  56. inline ll readll(){
  57. ll f=,x=;char ch;
  58. do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
  59. do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
  60. return f*x;
  61. }
  62. int main(){
  63. n=read();m=read();
  64. for(int i=;i<=n;i++)val[i]=readll();
  65. for(int i=;i<=n;i++){
  66. int u=read(),v=read();
  67. if(!u)rt=v;
  68. else addedge(u,v);
  69. }
  70. block=(int)sqrt(n);num=n%block==?n/block:n/block+;
  71. for(int i=;i<=n;i++)pos[i]=(i-)/block+;
  72. dfs(rt,);
  73. for(int i=;i<=num;i++){
  74. lx[i]=(i-)*block+;rx[i]=min(i*block,n);
  75. for(int j=lx[i];j<=rx[i];j++)ans[i]+=ask(tpos[j]+size[j]-)-ask(tpos[j]-);
  76. }
  77. while(m--){
  78. int opt=read(),x=read(),y=read();
  79. if(opt==)change(x,(ll)y);
  80. else printf("%llu\n",query(x,y));
  81. }
  82. return ;
  83. }

【bzoj4765】普通计算姬的更多相关文章

  1. BZOJ4765: 普通计算姬

    BZOJ4765: 普通计算姬 题目描述 传送门 题目分析 求的和非常奇怪,不具有连续性,所有上树的数据结构全死了. 考虑分块,思考对于一段连续的询问区间可以直接询问整块,零散块可以在树上dfs序暴力 ...

  2. [BZOJ4765]普通计算姬(分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 1725  Solved: 376[Submit][Status][Discus ...

  3. 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...

  4. [bzoj4765]普通计算姬(分块+树状数组+DFS序)

    题意 给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权值和.计算姬支持下列两种操作: 1 给定两个整数u,v,修改点u的权值为v. 2 ...

  5. BZOJ4765 普通计算姬(分块+树状数组)

    对节点按编号分块.设f[i][j]为修改j号点对第i块的影响,计算f[i][]时dfs一遍即可.记录每一整块的sum.修改时对每一块直接更新sum,同时用dfs序上的树状数组维护子树和.查询时累加整块 ...

  6. [bzoj4765]普通计算姬——分块

    Brief Description 给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权 值和.支持下列两种操作: 1 给定两个整数u,v, ...

  7. bzoj4765: 普通计算姬 (分块 && BIT)

    最近一直在刷分块啊 似乎感觉分块和BIT是超级棒的搭档啊 这道题首先用dfs预处理一下 得到每一个sum值 此时查询是O(1)的  (前缀和乱搞什么的 但是修改需要O(n) (需要修改该节点所有祖先的 ...

  8. bzoj4766 文艺计算姬

    Description "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬.文艺计算姬比普通计算机有更多的艺术细胞.普通计算机能计算一个带标号完全图的生成树个数, ...

  9. bzoj 4765: 普通计算姬

    Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中 ...

  10. BZOJ_4765_普通计算姬_分块+dfs序+树状数组

    BZOJ_4765_普通计算姬_分块 Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能 ...

随机推荐

  1. OpenStack Queens版本Horizon定制化开发

    工具环境 1.VMware workstation 12+: 2.Ubuntu系统+Linux Pycharm: 3.OpenStack Queens版本Horizon代码: 问题及解决 1.项目代码 ...

  2. BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)

    容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率 ...

  3. BZOJ4770 图样(概率期望+动态规划)

    考虑求出所有MST的权值和再除以方案数,方案数显然是2mn. 按位考虑,显然应该让MST里的边高位尽量为0.那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条 ...

  4. BZOJ5190 Usaco2018 Jan Stamp Painting(动态规划)

    可以大胆猜想的一点是,只要有不少于一个长度为k的颜色相同子串,方案就是合法的. 直接算有点麻烦,考虑减去不合法的方案. 一个正(xue)常(sha)的思路是枚举序列被分成的段数,问题变为用一些1~k- ...

  5. Skills - CF613B

    Lesha plays the recently published new version of the legendary game hacknet. In this version charac ...

  6. HDU3949 XOR (线性基)

    HDU3949 XOR Problem Description XOR is a kind of bit operator, we define that as follow: for two bin ...

  7. hdu 3948 The Number of Palindromes

    The Number of Palindromes Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (J ...

  8. (转)Linux下使Shell 命令脱离终端在后台运行

    转自: http://www.linuxidc.com/Linux/2011-05/35723.htm 方法如下: (1)输入命令: nohup 你的shell命令 & (2)回车,使终端回到 ...

  9. truncate与delete以及drop

    truncate:删除整个表,但不删除定义(删除了整个表的数据,但表结构还在) drop:删除整个表,表数据和表结构都删除了 delete:删除表中数据 比较delete和drop 1.truncat ...

  10. Html5学习2(Html表格、Html列表、Html5新元素、Canvas (坐标、路径、画圆、文本、渐变、图像))

    Html表格 1.表格中的表头:<th></th>.其中表头部分字体加粗,颜色深绿色 <h4>水平标题:</h4> <table border=& ...