Codeforces 杂题选讲

讲师:PinkRabbit 时间:20210701 地点:福建师范大学附属中学

Example.1 724E. Goods transportation

题意:

座城市,第 座城市生产了 单位货物,最多能卖出去 单位货物。

对于 ,城市 有一条单向运输线路通向

所有运输线路的容量都为 单位货物。不能反向运输,但是货物可以经过任意多个运输线路。

请求出总共最多能卖出去多少单位货物。

数据范围:n≤10^4。时间限制:2 s。Bonus:n≤10^6。

题解:

首先考虑网络流建模,模型显然;但是边数是 的且难以优化。

这时一个惊世骇俗的步骤登场了——由最大流等于最小割,然后用动态规划来优化!

根据最小割的第二种定义:

将原图划分为两个点集,使得他们之间的连边边权和最小。

所以,一个点要么割掉它向 的连边,要么割掉向 的连边;且如果一个点割掉了 ,那么它后面的所有点都必须把 割掉或者是要切断中层的所有连边。

根据第二定义也可以很快地得出转移方程: 表示 个连向 个连向 的最小割,有

于是这个及其震撼人心的 DP 就诞生了!

能不能再优化?设 为与 连接的点集,有:

提取一下:

枚举 并且排序一下即可做到

Example.2 802O. April Fools’ Problem (hard)

题意:

给定两个长度为 的正整数序列 ,以及一个正整数

请选出恰好 对数 满足

最小化

数据范围:。时间限制:10 s。

题解:

这题莫不是一个模拟费用流板子?但是 的限制怎么办?wqs 二分即可解决。

模拟费用流具体流程如下:从左到右扫描,依次加入 ,并在堆中查找最大的与 匹配;为了反悔,可以把 当作一个 加入堆中。

如何去掉一个 呢?考虑更加暴力地模拟费用流,发现复杂度瓶颈在于最短路,用线段树来维护最短路即可。

Example.3 827F. Dirty Arkady’s Kitchen

题意:

有一张 个点 条无向边的图,每条边的长度为 ,但是第 条边限制只能在时间段 内通过(即从一端点出发时必须在时刻 内),而且是禁止在一个点处停留的,也就是到达了一个点就必须选择一条出边继续走,经过一条边必须恰好花费 1 的时间,并且必须到达另一个端点。

求从 的最短路。

数据范围:。时间限制: s。

题解:

考虑一条边可以反复走,且反复走时奇偶位是分开的,所以考虑按照奇偶将所有点拆点,每条边也拆成 条有向边。

先讲做法:对于每个点记录 表示点最后一次可达的时间;将所有边加入堆中(按照 ),依次取出,如果 ,就拿 更新 ;否则将其加入这条边的暂存桶里边;每次遇到可行边时也更新 的桶,将 重新加入堆中;可达终点时输出

为什么是对的呢?因为 是递增的,所以当 时, 时刻一定是可达的;使用暂存桶的目的是保证这条新的边也是在正确的时候取出,不会影响前面的性质;由于这个性质,输出 也就很显然了。

Example.4 908H. New Year and Boolean Bridges

题意:

存在一张 个点的有向图,记 表示点 能否直接或间接到达点

你不知道这张图的边集,只给定了一个矩阵

其中 )只能为字符 之一,而 均为字符 -

对于两点 ):

1.如果 A,则表示

2.如果 O,则表示

3.如果 X,则表示

请求出满足条件的有向图的最小可能边数,或判定这样的图不存在。

数据范围:。时间限制: s。

题解:

考虑先将以 A 连接的 进行缩点,如果同一个强连通分量内存在 X 就矛盾无解。

注意到,若一个强连通分量大小大于等于二,那么它会多产生一的代价;如果大小等于一,那么没有额外代价;那么我们只要尝试将可以合并的尽可能合并。

因为大小为一的没啥关系,因此直接去掉;剩下的连通块数量 ,而 是可以接受的!

因此我们考虑指数级做法,设 ,表示 是否可以缩在一起(内部是否没有 X)。

我们的任务是找到最小的 使 ,其中乘法为子集卷积,复杂度 ,不可接受。

这时我们发现,即使改成或卷积,答案不变!复杂度 ,不可接受。

这时我们发现,复杂度的瓶颈不在于点积,而在于每次的 iFWT!由于我们只需要求一个点的值,因此我们直接 算这个点的点值。复杂度 ,可接受。

计算单点点值可以参考 FWT 的右乘矩阵 ,得

这时我来吊打标算了,直接随机化,随机一个排列,依次加入,每次争取加入最前面得强连通分量,直接 草过。

Example.5 1067D. Computer Game

题意:

个游戏,每个游戏有收益 ,成功率

每秒可以玩一个游戏,如果成功了则获得收益,并且获得一次可以升级游戏的机会。

每个游戏有升级后的收益 )。

问玩 秒游戏可以获得的期望收益的最大值。输出浮点数即可。

数据范围:。时间限制:3 s。

题解:

显然,第一次获得升级机会时,我一定要升级一个 最大得,然后一直点那个。

表示剩下 时间、没有升级时的最大期望收入,则:

变形一下:

这是一个一次函数!我们求出由每个 组成的上凸壳( 看作常数,直接忽略)。

对于凸壳上的每一段,均二分并矩阵快速幂加速找到分界点;当然利用倍增可以优化到一个

Example.6 1239E. Turtle

题意:

有一个 列的棋盘,每个格子里有整数

一只乌龟从 走到 ,只能往下走和往右走。定义路径权值为路径上经过的数值之和,乌龟想要最大化这个权值。

你可以对棋盘上的数字重新排列,最小化乌龟可能获得的最大权值。

请构造达到这个最小值的方案。

数据范围:。时间限制:5 s。

题解:

性质 1:第一行递增、第二行递减,证明使用交换法,显然不劣。

性质 2:乌龟要么走第一行,要么走第二行,证明考虑权值和的差分数组,即可证明是下凸的。

于是就可以愉快地背包拉!

Example.7 1270H. Number of Components

题意:

给定一个长度为 的数组 ,保证 互不相同。

对于数组中每一对顺序对),在 之间连一条无向边。

求图中连通块个数。

你需要支持 次修改 ,保证每次修改后 互不相同。

数据范围:。时间限制:8 s。

题解:

 

Example.8 1285F. Classical?

题意:

给定 个正整数 ,求

数据范围:。时间限制:1 s。

题解:

考虑枚举 ,然后找到 最大的。

考虑从大到小加入一个栈中,如果存在栈中元素与当前元素互质,我们可以把这个元素及其之后所有元素弹出,因为显然没用了。

问题就转化为维护栈中是否有元素与当前元素互质,有:

考虑如何维护 ;我们暴力枚举因数,因为可以去重,所以复杂度是 的。

总复杂度是两个 的,能不能再优化?我们把每个 的所有因数都加入 中,答案显然不变;只需找到 最大值即可。因为 必然是可以拆成这样两部分。