传送门

时隔一个月再次写点分治,比上一次要深入理解很多了。(虽然代码还是写不熟

模板题,不多说

  1. //POJ 1741
  2. //by Cydiater
  3. //2016.9.22
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <string>
  7. #include <algorithm>
  8. #include <queue>
  9. #include <map>
  10. #include <ctime>
  11. #include <cmath>
  12. #include <cstdlib>
  13. #include <iomanip>
  14. #include <iostream>
  15. using namespace std;
  16. #define ll long long
  17. #define up(i,j,n) for(int i=j;i<=n;i++)
  18. #define down(i,j,n) for(int i=j;i>=n;i--)
  19. const int MAXN=1e6+5;
  20. const int oo=0x3f3f3f3f;
  21. inline int read(){
  22. char ch=getchar();int x=0,f=1;
  23. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  24. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  25. return x*f;
  26. }
  27. int N,K,LINK[MAXN],len=0,root,siz[MAXN],sum,max_siz[MAXN],ans,dis[MAXN],head,tail,q[MAXN];
  28. bool vis[MAXN];
  29. struct edge{
  30. int y,next,v;
  31. }e[MAXN];
  32. namespace solution{
  33. inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
  34. void init(){
  35. if(N==0&&K==0)exit(0);
  36. len=ans=root=0;
  37. memset(LINK,0,sizeof(LINK));
  38. memset(vis,0,sizeof(vis));
  39. up(i,2,N){
  40. int x=read(),y=read(),v=read();
  41. insert(x,y,v);
  42. insert(y,x,v);
  43. }
  44. }
  45. void make_root(int node,int fa){
  46. siz[node]=1;max_siz[node]=0;
  47. for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
  48. make_root(e[i].y,node);
  49. siz[node]+=siz[e[i].y];
  50. max_siz[node]=max(max_siz[node],siz[e[i].y]);
  51. }
  52. max_siz[node]=max(max_siz[node],sum-max_siz[node]);
  53. if(max_siz[node]<max_siz[root])root=node;
  54. }
  55. void get_deep(int node,int fa){
  56. q[++tail]=dis[node];
  57. for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
  58. dis[e[i].y]=dis[node]+e[i].v;
  59. get_deep(e[i].y,node);
  60. }
  61. }
  62. int col(int node,int dist){
  63. int tmp=0;
  64. dis[node]=dist;head=1;tail=0;
  65. get_deep(node,0);
  66. sort(q+1,q+tail+1);
  67. while(head<tail){
  68. while(q[head]+q[tail]>K&&head<tail)tail--;
  69. tmp+=tail-head;
  70. head++;
  71. }
  72. return tmp;
  73. }
  74. void work(int node){
  75. ans+=col(node,0);vis[node]=1;
  76. for(int i=LINK[node];i;i=e[i].next)
  77. if(!vis[e[i].y]){
  78. ans-=col(e[i].y,e[i].v);
  79. sum=siz[e[i].y];root=0;
  80. make_root(e[i].y,node);
  81. work(root);
  82. }
  83. }
  84. void slove(){
  85. root=N;sum=0;max_siz[0]=oo;
  86. make_root(1,0);
  87. work(root);
  88. }
  89. void output(){
  90. printf("%d\n",ans);
  91. }
  92. }
  93. int main(){
  94. //freopen("input.in","r",stdin);
  95. using namespace solution;
  96. while(scanf("%d %d",&N,&K)!=EOF){
  97. init();
  98. slove();
  99. output();
  100. }
  101. return 0;
  102. }

POJ1741:tree的更多相关文章

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

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

  2. POJ1741 Tree(树分治——点分治)题解

    题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...

  3. [poj1741][tree] (树/点分治)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  4. POJ1741 tree 【点分治】

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 25286   Accepted: 8421 Description ...

  5. POJ1741 Tree(树的点分治基础题)

    Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v) ...

  6. POJ1741 Tree (点分治)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 25772   Accepted: 8566 Description ...

  7. POJ1741——Tree(树的点分治)

    1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...

  8. POJ-1741 Tree (树上点分治)

    题目大意:一棵带边权无根树,边权代表距离,求距离小于等于k的点对儿数. 题目分析:这两个点之间的路径只有两种可能,要么经过根节点,要么在一棵子树内.定义depth(i)表示点 i 到根节点的距离,be ...

  9. poj1741 Tree(点分治)

    题目链接:http://poj.org/problem?id=1741 题意:求树上两点之间距离小于等于k的点对的数量 思路:点分治模板题,推荐一篇讲的非常好的博客:https://blog.csdn ...

随机推荐

  1. 知乎UWP 预览

    又是很久都没有写博客了,为了表达歉意,奉上一个新的App,O(∩_∩)O! 因为商店的知乎太多了,然而,,所以一直打算自己动手写一个. 近段时间有些假期加上课程不是很忙,抽时间写了这个知乎.商店链接 ...

  2. android 使用多个接口

    今天,好久没有这么用过都忘记可以这样用了.来记录下: 一个类想要使用多个接口可以implements 接口1 , 接口2,...

  3. jq实现登陆页面的拖拽功能

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <script src ...

  4. oracle数据泵实现不同用户之间的导出导入

    来源于:http://www.cnblogs.com/kevinsun/archive/2007/02/03/638803.aspx http://blog.sina.com.cn/s/blog_68 ...

  5. VS2015中GLAUX库的链接问题

    最近学习OpenGL,照着例子写了个程序,用到了GLAUX库. #include <gl\glaux.h> #pragma comment(lib, "glaux") ...

  6. jquery 获取Select option 选择的Text和Value

    jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关设置 获取一组radio被选中项的值:var item = $(' ...

  7. iOS开发中的错误整理,iOS9之后的UIWindow(TopWindow)以及UIWindow与statusBar的关系

    iOS9之后的UIWindow的问题(TopWindow),以及UIWindow与statusBar之间的联系 1.出现的问题 iOS9之后UIWindow必须要指定一个根控制器,不然会报错!iOS9 ...

  8. jQuery常用的元素查找方法总结

    $("#myELement")    选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("di ...

  9. 【codevs1012】最大公约数和最小公倍数

    题目描述 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件:  1.P,Q是正整 ...

  10. PHP递归生成树形数组

    数据表结构 id   name  pid       ){ foreach($data as $row){ if($row['pid']==$p_id){ $tmp = $this->tree( ...