随笔分类 - 杂算法
摘要:袭击 给出 个点,求在前 个和后 个点中各选一个点的距离的最小值是多少。 分治 出处:《算法竞赛进阶指南》 题解: 先考虑只有一种点,怎么求两两距离的最小值。 分治,整体的最小距离 左半边的最小值,右半边的最小值,左右之间的最小值\()
阅读全文
摘要:主要有:剪枝、双向搜索、启发式搜索、迭代加深。 【剪枝】 拼接正方形 一道水题。基本想法:枚举每根木棍属于哪条边, 。 但是这太慢了,我们剪枝:如果一条边目前的累计长度 ,就返回 false。 于是我们就通过了。 运动员最佳
阅读全文
摘要:【单调栈】 柱状图最大矩形: 首先我们有一个最简单的方法: 枚举左右端点,然后再求中间的最小值,最后乘起来得到这段矩形组成的最大面积。 求最小值,我们考虑到ST表,我们可以用它优化到 。 接下来我们考虑转换枚举思路: 我们发现,一个矩形的大小,由它的左右端点,
阅读全文
摘要:【引入】 分(而)治(之)。 把一个问题分解成规模更小的子问题,从而降低复杂度的算法。 【归并排序】 我们用选择排序,复杂度是 。 但是如果我们把数组分成两半,分别选择排序,再归并起来,复杂度就降低为 ,几乎快了一半
阅读全文
摘要:【双指针】 双指针(two-pointer method) 这里的指针不是指向内存地址的指针,而是一个类似于光标的、指向一个位置的指针。 双指针是一个优化时间复杂度的思想。 【例子1】 两数之和 二重循环当然可以,但是太慢了。 于是我们可以使用双指针优化。 样例: 7 7 1 3 4 8 6 9 5
阅读全文
摘要:【哈希】 哈希可以分成两块:哈希函数和哈希表。 哈希函数是一种对应关系,它可以把任意类型映射为一个不太大的整数。 例如字符串,我们可能希望在字符串上记录一些属性。但是字符串不能当下标,那我们就只能加个大常数用 map。 这时,哈希函数出场了!如果我们有一个哈希函数 可以把一个字符串
阅读全文
摘要:【什么是虚树】 OI-wiki 如果题目里有一些关键点,而整棵树规模过大,我们可以考虑使用虚树来重新建树,以减少树的规模。 虚树:一颗树,树中包含所有关键点,以及任意多个关键点的 LCA。 可以发现在这颗虚树中,任意两个关键点的 LCA 都不变(还是对应原树的结点),并且只要我们把虚树中每条边的距离
阅读全文
摘要:郑哥狂喜 引入:静态区间第 k 小。给定一个数组和若干个询问,每次询问要查询某个区间中第 小的数。 这里介绍一种整体二分的算法。 如果只有一个询问,有一种二分的算法: 初始左右端点设为整个数组的最小值和最大值,不断二分。看一下二分值 ,比 小的数有 \(t\
阅读全文
摘要:这是一种线段树的高级玩法:在时间轴上运用。每个时间节点作为一个叶子,在一个时间区间内的标记,就可以影响到这个区间内的所有时刻。 题目传送门 建立一颗基于询问的线段树,也就是说线段树的每个结点都代表区间内的一些询问。 因为删除操作不好搞,我们反向考虑,求每个询问存在哪些边。 我们可以对每条边,求出它是
阅读全文
摘要:例题:CF600E 有一种暴力的想法是先 DFS 每个结点,再对每个结点 DFS 它的子树,用 数组记录每个结点子树的颜色出现情况。复杂度 。 一个平平无奇的优化:第一层 DFS 的时候,把重儿子放到最后搜索。在搜索重儿子的子树后,不清空 数组。然
阅读全文