国际惯例的题面:代价理解为重心和每个点这个点对的代价。根据期望的线性性,我们枚举每个点,计算会产生的ij点对的代价即可。那么,i到j的链上,i必须是第一个被选择的点。对于i来说,就是1/dis(i,j)。所以答案就是sigma(i,j) 1/(dis(i,j)+1)。然而这样计算是n^2的,考虑优化 ...
分类:
其他好文 时间:
2018-04-28 23:51:48
阅读次数:
245
【传送门:BZOJ1468&BZOJ3365】 简要题意: 给出一棵n个点的树,和每条边的边权,求出有多少个点对的距离<=k 题解: 点分治模板题 点分治的主要步骤: 1、首先选取一个点,把无根树变成有根树。 那么如何选点呢? ——树形DP 因为树是递归定义的,所以我们当然希望递归的层数最小。 每次 ...
分类:
其他好文 时间:
2018-04-27 13:31:06
阅读次数:
211
题意:给一棵带边权的树,统计距离$\leq k$的点对数量 这个这么基础的东西居然鸽了那么久,我还是退役吧... 点分治用于统计满足某些性质的点对或路径,但实际上就是个大暴力 这题要求统计树上距离$\leq k$的点对数量,那么我们这样做: 对于当前节点$x$,遍历子树并算出$x$的所有后代到$x$ ...
分类:
其他好文 时间:
2018-04-27 12:12:46
阅读次数:
160
国际惯例的题面:这种关于树上路径的题,我也没什么好办法,只好点分治。考虑当前分治重心为root,如何统计经过分治重心的路径的答案。我们令prf[i]表示某个点到root的路径(不含root)已经循环匹配S的前缀到位置i(下标从1开始到m-1,结尾为0)的方案数,suf[i]表示某个点到root的路径 ...
分类:
其他好文 时间:
2018-04-26 23:18:43
阅读次数:
180
洛谷 3806 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define N 10010 5 #define rg register 6 using namespace std; 7 int n,m,k,cnt,to ...
分类:
其他好文 时间:
2018-04-26 14:38:39
阅读次数:
186
这是一篇关于静态点分治的总结 点分治是什么? 就是一种统计答案的方式,用在树上 想要从头开始学点分治的话,可以点 "这里" 点分治的标志:树上处理点对问题大部分用点分 (当然还要复杂度允许) 对于一个树上点对问题,一个点只会有两种情况,一种是选,一种是不选 那么点分治就是按照这种思路去完成答案的统计 ...
分类:
其他好文 时间:
2018-04-26 01:33:35
阅读次数:
236
记录每一次分治时,达到重心的dep,加到一个桶中,没添加一个节点,查询桶中是否存在,之后加和和答案取最小值 ...
分类:
其他好文 时间:
2018-04-23 14:22:55
阅读次数:
169
预备知识 树的重心:删去这个点后,森林中所有树节点的最大值最小 点分治过程 具体实现 例题 POJ 1741 同BZOJ 1468(下面为POJ1741代码) ...
分类:
其他好文 时间:
2018-04-21 19:27:59
阅读次数:
145
【点分治】 〖模板代码〗 1 void getroot(int x,int fa) 2 { 3 sz[x]=1;mx[x]=0; 4 for(int i=first[x];i;i=e[i].next) 5 { 6 int to=e[i].to; 7 if(to==fa||vis[to])contin ...
分类:
编程语言 时间:
2018-04-19 21:47:52
阅读次数:
185
1 #include<cstdio> 2 #include<algorithm> 3 #define N 50010 4 #define M 500010 5 #define rg register 6 #define LL long long 7 using namespace std; 8 in ...
分类:
其他好文 时间:
2018-04-16 18:25:55
阅读次数:
146