【BZOJ2836】魔法树

Description

Input

Output

Sample Input

4
0 1
1 2
2 3
4
Add 1 3 1
Query 0
Query 1
Query 2

Sample Output

3
3
2

题解:链剖裸题+1,一棵子树对应DFS序上的一段区间。然而又没有1A

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define lson x<<1
  5. #define rson x<<1|1
  6. using namespace std;
  7. const int maxn=100010;
  8. int n,m,cnt;
  9. typedef long long ll;
  10. int to[maxn],next[maxn],head[maxn],p[maxn],q[maxn],siz[maxn],son[maxn],dep[maxn],top[maxn],fa[maxn];
  11. ll s[maxn<<2],ts[maxn<<2];
  12. char str[10];
  13. int rd()
  14. {
  15. int ret=0,f=1; char gc=getchar();
  16. while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
  17. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  18. return ret*f;
  19. }
  20. void dfs1(int x)
  21. {
  22. siz[x]=1;
  23. for(int i=head[x];i!=-1;i=next[i])
  24. {
  25. fa[to[i]]=x,dep[to[i]]=dep[x]+1;
  26. dfs1(to[i]);
  27. siz[x]+=siz[to[i]];
  28. if(siz[son[x]]<siz[to[i]]) son[x]=to[i];
  29. }
  30. }
  31. void dfs2(int x,int tp)
  32. {
  33. top[x]=tp,p[x]=++p[0];
  34. if(son[x]) dfs2(son[x],tp);
  35. for(int i=head[x];i!=-1;i=next[i])
  36. if(to[i]!=son[x])
  37. dfs2(to[i],to[i]);
  38. q[x]=p[0];
  39. }
  40. void pushdown(int l,int r,int x)
  41. {
  42. if(ts[x])
  43. {
  44. int mid=l+r>>1;
  45. ts[lson]+=ts[x],ts[rson]+=ts[x],s[lson]+=(mid-l+1)*ts[x],s[rson]+=(r-mid)*ts[x];
  46. ts[x]=0;
  47. }
  48. }
  49. void pushup(int x)
  50. {
  51. s[x]=s[lson]+s[rson];
  52. }
  53. void updata(int l,int r,int x,int a,int b,ll v)
  54. {
  55. if(a<=l&&r<=b)
  56. {
  57. s[x]+=(r-l+1)*v,ts[x]+=v;
  58. return ;
  59. }
  60. pushdown(l,r,x);
  61. int mid=l+r>>1;
  62. if(a<=mid) updata(l,mid,lson,a,b,v);
  63. if(b>mid) updata(mid+1,r,rson,a,b,v);
  64. pushup(x);
  65. }
  66. ll query(int l,int r,int x,int a,int b)
  67. {
  68. if(a<=l&&r<=b) return s[x];
  69. pushdown(l,r,x);
  70. int mid=l+r>>1;
  71. if(b<=mid) return query(l,mid,lson,a,b);
  72. if(a>mid) return query(mid+1,r,rson,a,b);
  73. return query(l,mid,lson,a,b)+query(mid+1,r,rson,a,b);
  74. }
  75. void add(int a,int b)
  76. {
  77. to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
  78. }
  79. void ADD(int x,int y,ll z)
  80. {
  81. while(top[x]!=top[y])
  82. {
  83. if(dep[top[x]]<dep[top[y]]) swap(x,y);
  84. updata(1,n,1,p[top[x]],p[x],z);
  85. x=fa[top[x]];
  86. }
  87. if(dep[x]>dep[y]) swap(x,y);
  88. updata(1,n,1,p[x],p[y],z);
  89. }
  90. int main()
  91. {
  92. n=rd();
  93. int i,a,b;
  94. memset(head,-1,sizeof(head));
  95. for(i=1;i<n;i++) a=rd()+1,b=rd()+1,add(a,b);
  96. dep[1]=1,dfs1(1),dfs2(1,1);
  97. m=rd();
  98. for(i=1;i<=m;i++)
  99. {
  100. scanf("%s",str);
  101. if(str[0]=='A') a=rd()+1,b=rd()+1,ADD(a,b,rd());
  102. else a=rd()+1,printf("%lld\n",query(1,n,1,p[a],q[a]));
  103. }
  104. return 0;
  105. }

【BZOJ2836】魔法树 树链剖分的更多相关文章

  1. 线段树&数链剖分

    傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现 ...

  2. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  3. UOJ#30/Codeforces 487E Tourists 点双连通分量,Tarjan,圆方树,树链剖分,线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建 ...

  4. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

  5. CF487E Tourists 圆方树、树链剖分

    传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...

  6. 2019.01.08 codeforces 1009F. Dominant Indices(长链剖分)

    传送门 长链剖分模板题. 题意:给出一棵树,设fi,jf_{i,j}fi,j​表示iii的子树中距离点iii距离为jjj的点的个数,现在对于每个点iii要求出使得fif_ifi​取得最大值的那个jjj ...

  7. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  8. BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)

    题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...

  9. 【BZOJ-2836】魔法树 树链剖分

    2836: 魔法树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 323  Solved: 129[Submit][Status][Discuss] ...

  10. 【SHOI2012】魔法树(树链剖分,线段树)

    [SHOI2012]魔法树 题面 BZOJ上找不到这道题目 只有洛谷上有.. 所以粘贴洛谷的题面 题解 树链剖分之后直接维护线段树就可以了 树链剖分良心模板题 #include<iostream ...

随机推荐

  1. 关于nodejs中npm命令没有反应的解决方法

    最近在学习angularJS,正在做一个单页面应用,在安装nodejs之后,发现命令行传了输入npm -v能输出结果外,其余npm的任何操作都没有反应,一开始我以为是下载的比较慢,等了半小时还是没动静 ...

  2. bootstrap 网格系统学习

    Bootstrap 官方文档中有关网格系统的描述: Bootstrap 包含了一个响应式的.移动设备优先的.不固定的网格系统,可以随着设备或视口大小的增加而适当地扩展到 12 列.它包含了用于简单的布 ...

  3. 解决Jquery Ajax提交 服务器端接收中文乱码问题

    看到有朋友说到用post提交方式解决,我指定了methord="post",仍然解决不了, 说一下解决办法,客户端进行编码,服务器端解码, 客户端:var where = esca ...

  4. SqlCommandBuilder的作用

    最近看一个案例,关于如何向数据库传数据,颇有发现. 以前我的数据都是采用Sql代码用SqlCommand一条一条语句的传入数据库. 但是今天发现有更好的方法. 代码如下: SqlConnection ...

  5. 【java设计模式】之 单例(Singleton)模式

    1. 单例模式的定义 单例模式(Singleton Pattern)是一个比較简单的模式.其原始定义例如以下:Ensure a class has only one instance, and pro ...

  6. SSM整合开发流程

    我的spring是3.2,mybatis是3.4 1 引入user libarary,我的jar文件如下 //spring mvc core springMVC\spring-web-.RELEASE ...

  7. 【转载】 使用rman进行坏块修复(ORA-01578、ORA-01110)

    [转自]http://blog.itpub.net/21256317/viewspace-1062055/ 使用rman进行坏块修复(ORA-01578.ORA-01110) 2012年的一天,处理的 ...

  8. Atitit.js获取上传文件全路径

    Atitit.js获取上传文件全路径 1. 默认的value只能获取文件名..安全原因.. 1 2. Firefox浏览器的读取 1 3. Html5 的file api 2 4. 解决方法::使用a ...

  9. 第三篇:python函数

    1.python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你 ...

  10. 解决国内gem不能用的问题

    转自:http://www.haorooms.com/post/gem_not_use 最近在安装SASS的时候,用到gem命令,但是运行出行如下错误! C:\Users\len>gem ins ...