题目

给出一棵带边权的树,问有多少对点的距离<=Len

分析

这是一道点分治的经典题目,可以给点分治的初学者练手。
点分治,顾名思义就是把每个点分开了处理答案。
假设,目前做到了以x为根的子树。
先求出子树中每个点到根的距离\(dis\),对于两个点\(i\)和\(j\),如果\(dis_{i}+dis_{j}<=k\),那么\((i,j)\)就是一个合法的点对。
而点对的路径就会有两种:经过x点的和不经过x点的。
显然,不经过x点的一定会再x的儿子的子树中被计算过。所以,我们要减去不经过x点的。
那怎么把不经过x点的减去呢?
用以x为根的子树的\(dis\)值(why?如果用以x的儿子为根的子树的\(dis\),就会有些可以到达x的儿子的却不能到达x的点对,被多减掉),来计算以x的儿子为根的子树中的点对数量,用减去它们就可以了。

记住要找重心

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
using namespace std;
long long dis[12000],next[22000],last[20020],to[20200],n,m,tot,v[20200],d[5000],sum=0,size[20020],mx[20020],f,root,ans;
bool bz[20020];
long long bj(long long x,long long y,long long z)
{next[++tot]=last[x];last[x]=tot;to[tot]=y;v[tot]=z;
}
void findroot(long long x,long long fa)
{mx[x]=0;size[x]=1;for(long long i=last[x];i;i=next[i]){if(to[i]!=fa && (!bz[to[i]])) {findroot(to[i],x);size[x]+=size[to[i]];mx[x]=max(mx[x],size[to[i]]);}}mx[x]=max(mx[x],f-size[x]);if (mx[x]<mx[root]) root=x;return;
}
void q(long long l,long long r)
{long long i=l,j=r,mid=d[(l+r)/2],e;while(i<j){while(dis[d[i]]<dis[mid]) i++;while(dis[d[j]]>dis[mid]) j--;if(i<=j){e=d[i];d[i]=d[j];d[j]=e;i++;j--;}}if(i<r) q(i,r);if(l<j) q(l,j);
}
long long dg1(long long x,long long fa)
{d[++tot]=x;for(long long i=last[x];i;i=next[i]){long long j=to[i];if(fa!=j && (!bz[j])){dis[j]=dis[x]+v[i];dg1(j,x);}}
}
long long getsum()
{q(1,tot);int i=1,j=tot;long long y=0;while(i<j){if(dis[d[i]]+dis[d[j]]-2>m)j--;else{y+=j-i;i++;            } }return y;
}
long long dg(long long x,long long fa)
{bz[x]=true;dis[x]=1;tot=0;dg1(x,fa);ans+=getsum();for(int i=last[x];i;i=next[i]){int j=to[i];if(!bz[j]) {dis[j]=v[i]+1;tot=0;dg1(j,x);ans-=getsum();f=size[j];root=0;findroot(j,x);dg(root,x);}}
}
int main()
{scanf("%lld%lld",&n,&m);for(long long i=1;i<=n-1;i++){long long x,y,z;scanf("%lld%lld%lld",&x,&y,&z);bj(x,y,z);bj(y,x,z);          }mx[0]=maxlongint;f=n;findroot(1,0);dg(root,0);printf("%lld\n",ans);
}

转载于:https://www.cnblogs.com/chen1352/p/9029689.html

树中点对距离(点分治)相关推荐

  1. 【BZOJ2152】聪聪可可,dfs+递推/点分治

    传送门 写在前面:╯﹏╰ 思路:刚开始char哥在做这个题,提供了不用点分治而是树上递推的做法,然后我就先调出来了-- 对树进行dfs,f[u][y]表示以x为根的子树中,与u距离为y的点(mod 3 ...

  2. bzoj 3730: 震波 动态点分治+树链剖分+线段树

    ##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并且随 ...

  3. 【SPOJ2666】QTree4【链分治】

    传送门 题意:给一棵带边权的树,每个点开始时为白色,维护两种操作: 1.改变一个点的颜色(白变黑,黑变白) 2.询问最远的两个白点之间的距离 树分治国集论文 链分治的本质其实就是树链剖分.它们的区别是 ...

  4. 2019纪中暑假游记+总结

    Travels总篇\texttt{Travels总篇}Travels总篇 7/4\texttt{7/4}7/4 下午才去纪中,早上就一大早和同学出去玩,看了蜘蛛侠然后到3点多才出发. 因为走南沙大桥所 ...

  5. 【JZOJ 4639】Angel Beats!

    Description 天使立华奏攻入了死后世界战线(SSS)的地下工会Guild,这是万分危急的时候.仲村由理指挥工会成员有条不紊地进行撤退工作.工会成员在Guild最深层工厂安放炸药需要很长的准备 ...

  6. 为何BERT在 NLP 中的表现如此抢眼?

    https://www.toutiao.com/a6701812430017659396/ 2019-06-13 08:55:01 Transformer体系结构模型,特别是 BERT,已经被证明在许 ...

  7. JZOJ 5930. 【NOIP2018模拟10.26】山花

    Description 3.1 Background 春日的山中灌木茂盛,几乎长到了人的腰间,将山间都铺满了绿色.雨后的灌木之间还带着晨露,总会沾湿走过的行人的衣裳. 林中枝叶茂密,不过树木长的并不紧 ...

  8. Prim和Dijkstra算法的区别

    在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法.二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的 ...

  9. P3899-[湖南集训]谈笑风生【主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3899 题目大意 给出nnn个点的一棵有根树,每次询问一个(p,k)(p,k)(p,k),求有多少个点对(b,c) ...

最新文章

  1. 动网论坛数据库字段表说明
  2. 北航成AAAI 2021最大赢家,两篇一作斩获最佳论文、提名奖,研究皆与Transformer相关...
  3. php PDO 浮点数返回,php – 如何在PDO中简单地返回对象?
  4. 百度不收录你网站的原因
  5. 问题:org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0
  6. 图像处理中腐蚀与膨胀的原理
  7. Linux CentOS下安装Oracle
  8. 阿里云 超级码力在线编程大赛初赛 第2场 题目3. 五字回文
  9. ros下的python代码的编写与回调函数
  10. 初入c++(七)运算符的重载+、-、*、/、[]、自加++的重载
  11. Feign 重试解析
  12. 【图像分割】基于matlab遗传算法道路图像分割【含Matlab源码 779期】
  13. wifi显示但是没有网络连接到服务器是怎么回事,wifi连接后显示网络连接不可用怎么办?...
  14. 腾讯云服务器登录宝塔面板
  15. HC05蓝牙点亮LED
  16. 2018新年计划-雄起
  17. 添闻地图商户采集教程-含高德、腾讯、百度
  18. Oracle用户被锁定问题
  19. 全面掌控!打造智慧城市建设的“领导驾驶舱”
  20. openlayer 画圆Circle实际半径解决方案

热门文章

  1. gan神经网络_神经联觉:当艺术遇见GAN
  2. opencv 运动追踪_足球运动员追踪-使用OpenCV根据运动员的球衣颜色识别运动员的球队
  3. R语言任务视图:机器学习与统计学…
  4. 如何正确选择合适的贷款机构,避免征信花掉?
  5. 专家建议用南方的养老金拿去救济东北,网友炸锅了
  6. 17年前存款11万,取款时银行以销户为由拒绝,法院判银行全额赔付
  7. python中count的作用_python中内置的.count是什么?
  8. macos可以升级到指定版本吗_iOS14如期而至!重大更新的全新版本,值得升级吗?答案在这...
  9. Cheat_Sheet ---Keras、Matlab、Matplotlib、Numpy、Pandas、Scikit-Learn、SciPy
  10. 李宏毅机器学习课程12~~~半监督学习