点分治的入门练习。

题目链接

BZOJ的链接(权限题)

关于点分治的思想我就不再重复了,这里重点说一下如何判重。

我们来看上图,假设我们去除了1节点,求出d[2]=1,d[3]=d[4]=2

假设k为5,这样我们会认为节点(2,3)(2,4)(3,4)的距离小于k,从而累计到答案中

但是我们以2为root做点分治时还会将(3,4)计算一遍,这样就重复了

所以我们每一次计算答案时还要讲所有多余情况减去,最终答案才是我们要求的答案

不难发现多余情况是在root节点与root子节点重复统计的,我们在点分治时将所有root子节点的答案减去就好了

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<algorithm>
  4. # include<set>
  5. # include<cmath>
  6. using namespace std;
  7. const int mn = ;
  8. struct edge{int to,next,dis;};
  9. edge e[mn*];
  10. int head[mn],edge_max;
  11. void add(int x,int y,int z)
  12. {
  13. e[++edge_max].to=y;
  14. e[edge_max].dis=z;
  15. e[edge_max].next=head[x];
  16. head[x]=edge_max;
  17. }
  18. bool vis[mn];
  19. int n,k,ans;
  20. int mx[mn],siz[mn],root,sum;
  21. int d[mn],deep[mn];
  22. void getroot(int x,int fa)
  23. {
  24. siz[x]=,mx[x]=;
  25. for(int i=head[x];i;i=e[i].next)
  26. {
  27. int u=e[i].to;
  28. if(u==fa || vis[u])
  29. continue;
  30. getroot(u,x);
  31. siz[x]+=siz[u];
  32. mx[x]=max(mx[x],siz[u]);
  33. }
  34. mx[x]=max(mx[x],sum-siz[x]);
  35. if(mx[root]>mx[x])
  36. root=x;
  37. }
  38. void getdeep(int x,int fa)
  39. {
  40. deep[++deep[]]=d[x];
  41. for(int i=head[x];i;i=e[i].next)
  42. {
  43. if(e[i].to==fa || vis[e[i].to])
  44. continue;
  45. d[e[i].to]=d[x]+e[i].dis;
  46. getdeep(e[i].to,x);
  47. }
  48. }
  49. int cal(int x,int now)
  50. {
  51. d[x]=now,deep[]=;
  52. getdeep(x,);
  53. sort(deep+,deep++deep[]);
  54. int t=,l,r;
  55. for(int l=,r=deep[];l<r;)
  56. {
  57. if(deep[l]+deep[r]<=k)
  58. {
  59. t+=r-l;
  60. l++;
  61. }
  62. else r--;
  63. }
  64. return t;
  65. }
  66. void solve(int x)
  67. {
  68. vis[x]=;
  69. ans+=cal(x,);
  70. for(int i=head[x];i;i=e[i].next)
  71. {
  72. if(vis[e[i].to])
  73. continue;
  74. ans-=cal(e[i].to,e[i].dis);
  75. sum=siz[e[i].to];
  76. root=;
  77. getroot(e[i].to,root);
  78. solve(root);
  79. }
  80. }
  81. int main()
  82. {
  83. int x,y,z;
  84. scanf("%d",&n);
  85. for(int i=;i<n;i++)
  86. {
  87. scanf("%d%d%d",&x,&y,&z);
  88. add(x,y,z),add(y,x,z);
  89. }
  90. scanf("%d",&k);
  91. mx[]=<<,sum=n;
  92. getroot(,);
  93. solve(root);
  94. printf("%d\n",ans);
  95. return ;
  96. }

洛谷4178 BZOJ1468 Tree题解点分治的更多相关文章

  1. BZOJ2654 & 洛谷2619:tree——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2654 https://www.luogu.org/problemnew/show/P2619 给你 ...

  2. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  3. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  4. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  5. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  6. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  7. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  8. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  9. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

随机推荐

  1. Chai.js断言库API中文文档

    基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...

  2. 前端路由的实现(三) —— History的pushState和replaceState用法

    HTML5中history提供的pushState, replaceState这两个API.它们提供了操作浏览器历史栈的方法. pushState能够在不加载页面的情况下改变浏览器的URL.这个方法接 ...

  3. 20190829 [ Night ] - 玻

    又考试 半集训真累…… 老帅哥露出会心的微笑.jpeg +------------+ | 寸 | | 土 分 | | 不 分 | | 让 必 | | 争 | +------------+ 考试过程: ...

  4. $\mathcal{Miemeng}$的病态码风计划

    晚上困的要命,先写个码风计划提提神. 计划目标 抵制无理压行. 抵制不可读代码. 倡导代码艺术化,分层化 具体的一些细节和展示 1>整体 首先要把预读部分(我这么叫的),命名域使用,全局变量定义 ...

  5. java验证码识别

    首先参考了csdn大佬的文章,但是写的不全ImgUtils类没有给出代码,无法进行了 写不完整就是制造垃圾 不过这个大佬又说这个大佬的文章值得参考于是又查看这篇文章 有案例https://blog.c ...

  6. neo4j中对节点关系和聚类的思考

    由于neo4j在查找过程中具有事务,所以查询的速度非常慢!给出的建议如下: 一,将所有查询放在一个Session中,当所有查询完毕以后在关闭Driver和Session: 二,使用neo4j连接池,使 ...

  7. SQL SERVER 自增列的方法

    declare @Table_name varchar(60) set @Table_name = ''; if Exists(Select top 1 1 from sysobjects       ...

  8. 用 Python 写一个 NoSQL 数据库Python

    NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写 ...

  9. HR招聘_(五)_招聘方法论(电话邀约)

    .主动候选人 这部分候选人通过职位广告直接投递,大多对公司意愿度高(排除少数海投候选人),所以电话中一般需要了解如下信息: 目前状态,在职还是离职: 离职原因以及真实诉求: 岗位职责和团队情况: 薪资 ...

  10. Mysql的CMD操作

    一.MySQL登录和退出——在CMD模式操作 l  语法格式:mysql.exe –h主机名 –u用户名 –p密码 l  参数说明:   mysql.exe是mysql服务器的主应用程序.   -h代 ...