分治法
文章平均质量分 76
leodestiny
这个作者很懒,什么都没留下…
展开
-
UVA 1152 4 Values whose Sum is 0 中途相遇法 二分查找
题意:给出大小为N的数组A,B,C,D,求有多少组a+b+c+d = 0思路:直接枚举就是O(n^4); 但是我们将上面的式子变形后:a+b+c = -d这样,我们可以计算a+b+c,然后查找是否有-d存在,查找可以用二分实现。这样的复杂度就是O(n^3logn)。 当然可以继续优化,a + b = -c - d。先计算所有a+b的和,同样根据c+d原创 2015-01-28 08:59:40 · 460 阅读 · 0 评论 -
HDU 1003 Max Sum 最大连续和 分治法
题意:给出一个数组,求出最大连续和。思路:这里我们用分治法来求解。和其他的数组上的分治一样,我们将数组A进行二等分为B,C; 最大连续和就有有三种可能:1.位于数组B中。2.位于数组C中。3.跨过数组A的中点,一部分位于B中,一部分位于C中。 对于前两种情况,我们可以递归处理,所以我们需要考虑的是第三种情况。 需要注意到原创 2015-01-23 10:35:57 · 833 阅读 · 0 评论 -
POJ 2299 Ultra-QuickSort 分治法求逆序数
题意:给出一个数组,求出该数组的逆序对的个数。思路:我们用分治法来求解该题。对于数组A,我们将其二等分成B,C两个数组,则逆序对位于下面的三种情况之一 1.位于数组B中,2.位于数组C中。3.一个位于B中,一个位于C中。 对于前两种情况,我们可以递归处理,所以我们只需考虑的是第三种情况,就是对于C中每个数字,考虑B中有多少个比他大。可以用归并原创 2015-01-23 09:31:12 · 664 阅读 · 0 评论 -
POJ 1655 Balancing Act 树的重心
题意:给出一颗树,求树的重心:删除该点后,形成的森林中每个子树的节点数量的最大值最小。思路:因为题目中给出的是无向、无根的树,我们可以先将他有根、有向化。考虑一个节点,将该节点删除后,会将该点和所有孩子的边删除,同时删除的是该点和父亲的边。这样产生的森林就分成了两个部分,第一部分是由该节点的子树形成,所以我们要求出子树中节点的最大值。第二部分是由父亲节点形成的树,这一部分的节点是无法直接求原创 2015-01-23 09:38:48 · 416 阅读 · 0 评论 -
POJ 3714 Raid 最近点对
题意:有N个士兵,N个炮台。给出这2N个点的坐标,求士兵距离炮台的最近距离。思路:最近点对问题。因为有两种点,我们只需求出这两种点之间的最短距离。 在算法中,我们对两种点给不同的标记,然后计算不同标记点的距离即可。#include #include #include #include #include using namespace std;cons原创 2015-01-24 21:04:49 · 530 阅读 · 0 评论 -
HDU 1007 Quoit Design 最近点对 分治法
题意:有N个玩具,给出这些玩具的点的坐标。求出一个半径最大的圆环,使这个圆环至多能套进一个玩具。思路:圆环至多能套进一个玩具,当且仅当圆环的直径小于等于任意两点的距离。这样就转化成了最近点对问题。 对于最近点对问题,同样是用分治法进行处理。 首先,对所有点按照x坐标从小到大进行排序,按照x坐标将点分成两半。 同样,分治后有原创 2015-01-24 18:42:55 · 582 阅读 · 0 评论 -
UVA 1608 Non-boring sequences 递归分治
题意:定义一个序列为不无聊的,当每个子序列都包含一个唯一的数字。反之,这样的序列为无聊的序列。给出一个序列,判断该序列是无聊的序列还是不无聊的序列。思路:注意到:如果某个序列中包含一个唯一的数字,那所有跨过该数字的序列都是不无聊的,所以我们只需判断其左右是否是不无聊的序列即可。 上面的形式非常像分治法,所以我们看看能不能利用分治进行求解。 首先要原创 2015-01-23 20:16:28 · 2003 阅读 · 2 评论 -
POJ 1741 Tree 树上分治
题意:给出一个带权的树。求出所有无序对(u,v),满足节点u和节点v之间的距离小于等于K。思路:首先想到的是暴力枚举所有的距离,然后直接判断。但是这样的时间复杂度为O(N^2),会超时。 如果我们能将分治的思想对树进行划分,在每层我们再计算。这样的时间复杂度基本可以满足要求了。 在树上进行分治,我们要找到一个点,当删除该点时,每个子树的节点的最原创 2015-01-23 16:01:33 · 629 阅读 · 0 评论