点分治【bzoj1468】 Tree】的更多相关文章

POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and v. Give an integer k,for every pair (u,v) of vertices is called valid i…
P4169-CDQ分治/K-D tree(三维偏序)-天使玩偶 这是一篇两种做法都有的题解 题外话 我写吐了-- 本着不看题解的原则,没写(不会)K-D tree,就写了个cdq分治的做法.下面是我的写题步骤: 想着树状数组维护不了区间最值,于是写了线段树,因为一个**的错误调了几个小时: cdq只写了两个方向.显然是错的,因为没考虑修改.所以挂了: 加上另外两个方向,正确性终于ok,兴高采烈地交上去然后TLE: #include<iostream> #include<cstdio>…
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 Solution 点分治模板 Code #include<iostream> #include&l…
点分治的入门练习. 题目链接 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子节点重复统计的,我们在点…
同poj1741. 换了个更快的姿势,不会重复统计然后再减掉什么的啦~ #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define MAXN 40001 #define INF 2147483647 typedef pair<int,int> Point; int n,K,ans; int v[MAXN<<1],w[MAXN<<…
最经典的点分治题目,在递归子树的时候减去在算父亲时的不合法方案. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<cmath> #define ll long long #define N 40005 using namespace std; struct Node{ int to,ne…
VJ传送门 简要题意:给出两个大小均为\(N\)的点集\(A,B\),试在\(A\)中选择一个点,在\(B\)中选择一个点,使得它们在所有可能的选择方案中欧几里得距离最小,求出这个距离 下面给出的两种解法基本上都能够被卡成\(O(n^2)\)-- ① 按照平面最近点对的做法去做,只是在贡献答案的时候加上所属点集不同的限制就可以了. 当然这个可以卡,只要把\(A\).\(B\)集合之间分得很开,而\(A\)集合和\(B\)集合内部的点两两之间的距离很小,这样在分治下去的过程中没法贡献答案,最后在分…
[传送门:BZOJ1468&BZOJ3365] 简要题意: 给出一棵n个点的树,和每条边的边权,求出有多少个点对的距离<=k 题解: 点分治模板题 点分治的主要步骤: 1.首先选取一个点,把无根树变成有根树. 那么如何选点呢? ——树形DP 因为树是递归定义的,所以我们当然希望递归的层数最小. 每次选取的点,要保证与此点相连的结点数最多的连通块的结点数最小,我们把这个点叫做“重心” 那么找到一颗树的重心有以下算法: (1)dfs一次,算出以每个点为根的子树大小 (2)记录以每个结点为根的最大…
点分治[bzoj1468] Tree Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k Output 一行,有多少对点之间的距离小于等于k 点分治开始入门. 点分治,主要是解决形如:给你一棵树,求树上满足XX条件的点对的对数. 所以说应对的问题很多时候都和树形DP相同. 首先告诉自己,分治是高效的算法. 想一下,平时在面对普通的分治问题,每次肯定都是…
1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k Output 一行,有多少对点之间的距离小于等于k Sample Input 7 1 6 13 6…