最经典的点分治题目,在递归子树的时候减去在算父亲时的不合法方案。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<algorithm>
  6. #include<cmath>
  7. #define ll long long
  8. #define N 40005
  9. using namespace std;
  10. struct Node{
  11. int to,next,v;
  12. }e[N<<];
  13. int sum,rt,n,k,head[N],tot,cnt,mx[N],sz[N],tmp[N],ans;
  14. bool vis[N];
  15. void add(int x,int y,int z){
  16. e[++tot]=(Node){y,head[x],z};head[x]=tot;
  17. e[++tot]=(Node){x,head[y],z};head[y]=tot;
  18. }
  19. void getroot(int x,int fa){
  20. mx[x]=;sz[x]=;
  21. for(int i=head[x];i;i=e[i].next)if(e[i].to!=fa&&!vis[e[i].to]){
  22. getroot(e[i].to,x);
  23. sz[x]+=sz[e[i].to];
  24. mx[x]=max(mx[x],sz[e[i].to]);
  25. }mx[x]=max(mx[x],sum-sz[x]);
  26. if(mx[x]<mx[rt])rt=x;
  27. }
  28. void getdis(int x,int fa,int d){
  29. tmp[++cnt]=d;
  30. for(int i=head[x];i;i=e[i].next)if(e[i].to!=fa&&!vis[e[i].to]){
  31. getdis(e[i].to,x,d+e[i].v);
  32. }
  33. }
  34. void calc(int x,int dis,int type){
  35. cnt=;
  36. getdis(x,,);
  37. sort(tmp+,tmp++cnt);
  38. int l=,r=cnt;
  39. while(l<=r){
  40. while(tmp[l]+tmp[r]>dis)r--;
  41. if(l>r)break;
  42. ans+=(r-l)*type;l++;
  43. }
  44. }
  45. void work(int x){
  46. vis[x]=;
  47. calc(x,k,);
  48. for(int i=head[x];i;i=e[i].next)if(!vis[e[i].to]){
  49. calc(e[i].to,k-e[i].v*,-);
  50. sum=sz[e[i].to];rt=;
  51. getroot(e[i].to,);
  52. work(rt);
  53. }
  54. }
  55. int main(){
  56. // freopen("test.in","r",stdin);
  57. scanf("%d",&n);
  58. for(int i=;i<n;i++){
  59. int x,y,z;scanf("%d%d%d",&x,&y,&z);
  60. add(x,y,z);
  61. }
  62. scanf("%d",&k);
  63. sum=mx[]=n;rt=;ans=;
  64. getroot(,);
  65. work(rt);
  66. printf("%d\n",ans);
  67. }

1468: Tree

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1099  Solved: 581
[Submit][Status][Discuss]

Description

给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K

Input

N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k

Output

一行,有多少对点之间的距离小于等于k

Sample Input

7
1 6 13
6 3 9
3 5 7
4 1 3
2 4 20
4 7 2
10

Sample Output

5

bzoj1468 Tree的更多相关文章

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

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

  2. BZOJ1468:Tree(点分治)

    Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是 ...

  3. BZOJ1468: Tree & BZOJ3365: [Usaco2004 Feb]Distance Statistics 路程统计

    [传送门:BZOJ1468&BZOJ3365] 简要题意: 给出一棵n个点的树,和每条边的边权,求出有多少个点对的距离<=k 题解: 点分治模板题 点分治的主要步骤: 1.首先选取一个点 ...

  4. 【点分治】bzoj1468 Tree

    同poj1741. 换了个更快的姿势,不会重复统计然后再减掉什么的啦~ #include<cstdio> #include<algorithm> #include<cst ...

  5. 洛谷4178 BZOJ1468 Tree题解点分治

    点分治的入门练习. 题目链接 BZOJ的链接(权限题) 关于点分治的思想我就不再重复了,这里重点说一下如何判重. 我们来看上图,假设我们去除了1节点,求出d[2]=1,d[3]=d[4]=2 假设k为 ...

  6. 点分治【bzoj1468】 Tree

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

  7. 【BZOJ-1468】Tree 树分治

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

  8. C++之路进阶——bzoj1468(tree)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ ...

  9. 【BZOJ1468】Tree

    Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是 ...

随机推荐

  1. 简单的STM32 汇编程序—闪烁LED

    要移植操作系统,汇编是道不得不跨过去的坎.所以承接上篇的思路,我准备用汇编写一个简单的闪烁LED灯的程式.以此练习汇编,为操作系统做准备. 第一步,还是和上篇一样,建立一个空的文件夹. 第二步,因为是 ...

  2. 【总结】/etc/rc.d/rc.local 与 /etc/profile .bash_profile .bashrc 文件执行顺序

    登陆shell与交互式非登陆shell的区别 登录shell 所谓登录shell,指的是当用户登录系统时所取的那个 shell.登录shell属于交互式shell. 登录shell将查找4个不同的启动 ...

  3. 【Alpha版本】冲刺-Day10

    队伍:606notconnected 会议时间:11月18日 会议总结 张斯巍(433) 今天安排:完成剩余界面的设计,小修小补 完成度:100% 遇到的问题:无 感想:因为自己是负责界面美工部分的, ...

  4. H5项目常见问题及注意事项

    Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" content="wi ...

  5. c++笔记整理

    一:导读 假设编写了一个C++程序,如何让他允许起来呢,这取决于计算机环境和所使用的C++编译器. 1.使用文本编辑器编写程序,并将其保存在文档中,====此就是源代码 2.编译源代码,编译过程就意味 ...

  6. chrome浏览器跨域设置

    1.新建快捷方式,在目标那里的路径后面跟上如下参数 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -- ...

  7. mysql锁SELECT FOR UPDATE【转】

    MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE ...

  8. 使用Java判断字符串中的中文字符数量

    Java判断一个字符串str中中文的个数,经过总结,有以下几种方法(全部经过验证),可根据其原理判断在何种情况下使用哪个方法: 1. char[] c = str.toCharArray(); for ...

  9. MySQL 5.7 学习:功能性能的提升

    背景: 继上次介绍 初识 MySQL 5.6 新功能.参数完之后,刚好MySQL 5.7又GA了,在官方测试里看到,MySQL5.7在功能.性能.可用性.安全和监控上又提升了很高.现在看看和MySQL ...

  10. Eclipse下无法自动编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法(转载)

    文章来源:http://www.cnblogs.com/xfiver/archive/2010/07/07/1772764.html 1.  IOException parsing XML docum ...