点分治
EMber _
人但有追求,世界亦会让路。
展开
-
JZOJ4715树上路径 点分治
这居然是联赛题我一脸懵逼。。根本没往那方向上想。 题目大意: 让你求树上最短的路径,但是路径长度必须>=l,<=r,n<=10^5,r-l<=10^6,l,r<=10^9; 其实是我点分治没怎么打过,这其实是一道很一眼的点分治的题。。我是懵比了。。 可以算是模板题吧,我是直接点分治莽一波,然后就过了,题解还说是二分,我比赛时候就想到是二分。。mdzz。 代码:#include<iostre原创 2016-08-19 16:45:45 · 374 阅读 · 0 评论 -
poj1741 Tree
一万年不打点分治的我来打点分治了。。。(╯‵□′)╯︵┻━┻ 重新复(学)习了一波点分治,之前学的不是很懂。。然后现在发现这东西相当简单= =至少比链剖简单多了,好吧其实都差不多简单。。。 点分治的话,就是讨论对于一个点,答案的两种情况,即是否跨过这个点,不跨过的我们可以直接算他的子树,跨过的我们可以可以对这个点延伸出的几棵子树各做一次dfs 记录子树中出现的距离值,对于一棵树的距离值数组,排原创 2017-04-20 16:42:46 · 184 阅读 · 0 评论 -
bzoj2599: [IOI2011]Race 点分治
题意:给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000明显点分治,但是愚蠢的我并没有想到怎么分治。。%hzwer。 开一个t[i]表示整棵树中权值和为i的路径有多少条,那么我们分治每一颗树的时候,再算出子节点到当前根的dis[x]权值距离和d[x]点数距离,然后就可以直接更新了ans=min(ans,t[k-dis[x]]+d[原创 2017-04-22 11:18:17 · 716 阅读 · 0 评论 -
bzoj3697 采药人的路径 点分治
一道拖了很久的点分治,现在把他搞定了。 来自出题人hta的题解: 本题可以考虑树的点分治。问题就变成求过根满足条件的路径数。 路径上的休息站一定是在起点到根的路径上,或者根到终点的路径上。 如何判断一条从根出发的路径是否包含休息站?只要在dfs中记录下这条路径的和x,同时用个标志数组判断这条路径是否存在前缀和为x的节点。 这样我们枚举根节点的每个子树。用f[i][0…1],g[i][0…1原创 2017-07-19 20:59:58 · 233 阅读 · 0 评论 -
bzoj1468 Tree 点分治
和那个poj1741是同一道题目,不过既然写了就顺便说说吧。 寻找重心,保证复杂度。 然后对于每个重心(从上往下),计算路径经过他的和,减去路径起点终点都在子树内的路径。 如何计算?扫一遍这个点的所有子树,记录一下路径和,存在一个数组里面,然后双指针扫扫就没了。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i原创 2017-09-13 21:28:43 · 194 阅读 · 0 评论