SOS Dynamic Programming [Tutorial] – usaxena95 on CodeForces
通过优化,将子集求和类相关问题的时间复杂度由朴素的 优化到 。
一场相当有收获的比赛。比赛链接
A – 石老板举世无双
解法一
尝试观察规律。我们发现,在完成次操作以后,左端点的可能取值为,右端点的可能取值为。假如现在我们达到最终状态,其。那么,在的二进制表示中,如果从高到底第位为,则在第轮中,有check (mid) == 0
,向右区间递归;否则向左区间递归。这是很容易解释的:若向右递归,则右端点不变。而在下一层,右端点表示中的所有系数乘,所以体现为二进制位末尾添一个。反之,就变成,在下一层中体现为。如果其有位为,则到达该状态的概率为。
以时的状态为例。的三位二进制表示为,则推断出在前三轮分别向右、左、右区间递归,到达其的概率为。 (更多…)
Algorithm 457: Finding All Cliques of an Undirected Graph [H] – Coen Bron* and Joep Kerboscht – Archives of Communication of ACM
原Essay详细而准确地描述了该算法的过程,不需要额外的注解也能轻松理解。若英语阅读吃力,也有一份不错的中文详述:
极大团(maximal clique)算法:Bron-Kerbosch算法 – Bowiee – 简书
下面给出一份参考实现,能够找出所有极大团。使用unsigned long long
存储各状态点的集合,二进制表示下从低到高第位为表示点存在于集合中。 (更多…)
介值定理
若有连续函数,且不失一般性地,令,则对于任意实数,存在。
容易由实数完备性证明。直观理解,即可以画出一段连续曲线,其两端点分别为,而笔不离开纸面。
离散函数值上的介值定理
若存在函数,且满足,则对于,若有整数,存在一个。
证明显然。
在OI中的实际意义?
我们常遇到这样一类函数:在某些数列上进行统计,邻项函数值之间的差为,如括号序前缀和(),则可以通过上述性质判断某两点之间函数值是否存在。
例如CF1695C – Zero Path,本质上路径上数字和是一个满足上述条件的整数离散函数。
再例如CF1658F – Juju and Binary String,可以将题意转化为一个函数,且满足上述性质;同时有函数,则可以证明一定存在。
CodeForces Round #755 Div.2 F / Div.1 D Serious Business
此题整整困了我一天半,耗费了好几张草稿纸。实在走投无路,翻看题解,却发现正解曾经近在咫尺。有必要稍作整理。
考虑DP。
错误转移1
这道题与清理班次(《算法竞赛进阶指南》上的一道例题)过于相似,都是“给定一些段落,选择其中一些完整覆盖,求最小花费”的形式。记上述花费为。但本题与原题不一样之处在于其起点和终点是任意给定的。我的第一反应是枚举在位置从第行转到第行,利用数据结构维护所有,在转移到第二行,解锁到达的最小代价。对于各行前缀和,我们可以利用线段树或树状数组维护。同时我们也知道可以利用数据结构优化在的时间内,计算出对于一个固定的起点,所有的值。 (更多…)