可以说是点分治第一题,之前那道的点分治只是模模糊糊,做完这道题感觉清楚了很多,点分治可以理解为每次树的重心(这样会把数分为若干棵子树,子树大小为log级别),然后统计包含重心的整个子树的值减去各个子树的值,这样算出的就是与这个重心有关的情况的答案,比如这道题,求路径,那么就考虑在重心所在的子树中所有的路径减去不过重心的路径就是过重心的路径了。之前重心没找对...poj时间卡的紧就T了。。

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cmath>
  7. #include <ctime>
  8.  
  9. using namespace std;
  10.  
  11. struct Edge
  12. {
  13. int to,next,w;
  14. }e[];
  15.  
  16. int n,k,cnt,p[],Ans;
  17. int Son[],f[],val[],depth[];
  18. bool visited[];
  19.  
  20. void Add_edge(const int x,const int y,const int z)
  21. {
  22. e[++cnt].to=y;
  23. e[cnt].next=p[x];
  24. e[cnt].w=z;
  25. p[x]=cnt;
  26. return ;
  27. }
  28.  
  29. void Get_root(const int S,const int fa,const int tot,int & root)
  30. {
  31. Son[S]=,f[S]=;
  32. for(int i=p[S];i;i=e[i].next)
  33. {
  34. if(e[i].to==fa || visited[e[i].to])continue;
  35. Get_root(e[i].to,S,tot,root);
  36. Son[S]+=Son[e[i].to];
  37. f[S]=max(f[S],Son[e[i].to]);
  38. }
  39. f[S]=max(f[S],tot-Son[S]);
  40. if(f[S]<f[root])root=S;
  41. return ;
  42. }
  43.  
  44. void Get_depth(const int S,const int fa)
  45. {
  46. val[++val[]]=depth[S];
  47. for(int i=p[S];i;i=e[i].next)
  48. {
  49. if(e[i].to==fa || visited[e[i].to])continue;
  50. depth[e[i].to]=depth[S]+e[i].w;
  51. Get_depth(e[i].to,S);
  52. }
  53. return ;
  54. }
  55.  
  56. int Calc(const int S,const int w)
  57. {
  58. depth[S]=w,val[]=;
  59. Get_depth(S,);
  60. sort(val+,val+val[]+);
  61. int t=,l,r;
  62. for(l=,r=val[];l<r;)
  63. {
  64. if(val[l]+val[r]<=k)t+=r-l,l++;
  65. else r--;
  66. }
  67. return t;
  68. }
  69.  
  70. void TDC(const int S)
  71. {
  72. Ans+=Calc(S,);
  73. visited[S]=true;
  74. for(int i=p[S];i;i=e[i].next)
  75. {
  76. if(visited[e[i].to])continue;
  77. Ans-=Calc(e[i].to,e[i].w);
  78. int root=;
  79. Get_root(e[i].to,,Son[e[i].to],root);
  80. TDC(root);
  81. }
  82. return ;
  83. }
  84.  
  85. int main()
  86. {
  87. int x,y,z,i,root;
  88.  
  89. while(scanf("%d%d",&n,&k) && n && k)
  90. {
  91. root=,memset(p,,sizeof(p));cnt=;
  92. memset(visited,,sizeof(visited));
  93. Ans=;
  94. for(i=;i<n;++i)
  95. {
  96. scanf("%d%d%d",&x,&y,&z);
  97. Add_edge(x,y,z);
  98. Add_edge(y,x,z);
  99. }
  100.  
  101. f[]=0x3f3f3f3f;
  102. Get_root(,,n,root);
  103. TDC(root);
  104.  
  105. printf("%d\n",Ans);
  106. }
  107.  
  108. return ;
  109. }

[bzoj1468][poj1741]Tree[点分治]的更多相关文章

  1. [bzoj1468][poj1741]Tree_点分治

    Tree bzoj-1468 poj-1741 题目大意:给你一颗n个点的树,求树上所有路径边权和不大于m的路径条数. 注释:$1\le n\le 4\cdot 10^4$,$1\le m \le 1 ...

  2. 【BZOJ-1468】Tree 树分治

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] ...

  3. [POJ1741]Tree(点分治)

    树分治之点分治入门 所谓点分治,就是对于树针对点的分治处理 首先找出重心以保证时间复杂度 然后递归处理所有子树 对于这道题,对于点对(u,v)满足dis(u,v)<=k,分2种情况 路径过当前根 ...

  4. 【BZOJ1468】Tree [点分治]

    Tree Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距 ...

  5. [poj1741]Tree(点分治+容斥原理)

    题意:求树中点对距离<=k的无序点对个数. 解题关键:树上点分治,这个分治并没有传统分治的合并过程,只是分成各个小问题,并将各个小问题的答案相加即可,也就是每层的复杂度并不在合并的过程,是在每层 ...

  6. POJ1741 Tree 树分治模板

    http://poj.org/problem?id=1741   题意:一棵n个点的树,每条边有距离v,求该树中距离小于等于k的点的对数.   dis[y]表示点y到根x的距离,v代表根到子树根的距离 ...

  7. POJ1741 Tree + BZOJ1468 Tree 【点分治】

    POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive ...

  8. 点分治【bzoj1468】 Tree

    点分治[bzoj1468] Tree Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边 ...

  9. BZOJ.1468.Tree(点分治)

    BZOJ1468 POJ1741 题意: 计算树上距离<=K的点对数 我们知道树上一条路径要么经过根节点,要么在同一棵子树中. 于是对一个点x我们可以这样统计: 计算出所有点到它的距离dep[] ...

随机推荐

  1. bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 首先,对于和 1 相连的点,一定是从某个点出发,回到另一个点: 所以需要枚举起点和终点 ...

  2. JSP-Runoob:JSP 异常处理

    ylbtech-JSP-Runoob:JSP 异常处理 1.返回顶部 1. JSP 异常处理 当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方.JSP代码中通常 ...

  3. 设计模式(二):单例模式(DCL及解决办法)

    public class Singleton { //懒汉模式 双重检查锁定DCL(double-checked locking) //缺点:由于jvm存在乱序执行功能,DCL也会出现线程不安全的情况 ...

  4. PCB ODB++(Gerber)图形绘制实现方法

    这里讲解一下用net解析PCB图形绘制实现方法 一.解析PCB图形绘制实现 解析PCB图形,说简单也非常简单,先说一下,PCB Gerber图形由:点,线,弧,铜皮,文字 5类元素组成,通常简写为:P ...

  5. max_allowed_packet设置问题

    最近在运行的项目出现了一个线上事故,有人反映商城的东西下不了单了,到后台看了一下,果然报了一个错 Cause: com.mysql.jdbc.PacketTooBigException: Packet ...

  6. Akka源码分析-ask模式

    在我之前的博文中,已经介绍过要慎用Actor的ask.这里我们要分析一下ask的源码,看看它究竟是怎么实现的. 开发时,如果要使用ask方法,必须要引入akka.pattern._,这样才能使用ask ...

  7. 设计模式 | 适配器模式(adapter)

    定义: 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.   书中说到Gof的设计模式中,讲了两种类型的适配器模式: 1.类适配 ...

  8. RabbitMQ死循环-延长ACK时间

    一.应用背景 今天做一个需求,要将RabbitMQ中的任务取出并执行,为防止任务执行期间出错,设置NO_ACK=FALSE标志,这样.一旦任务没有应答的话,相应的任务就会被RabbitMQ自动Re-Q ...

  9. Sqoop 产生背景(一)

    Sqoop 的产生主要源于: 1.目前很多使用hadoop技术的企业,有大量的数据存储在传统关系型数据库中. 2.早期由于工具的缺乏,hadoop与传统数据库之间的数据传输非常困难. 1)传统数据库中 ...

  10. python gdal 矢量转栅格

    data = gdal.Open(templateTifFileName, gdalconst.GA_ReadOnly)geo_transform = data.GetGeoTransform()x_ ...