KEYENCE Programming Contest 2019 题解
比赛地址
ABC 就不写了。
D - Double Landscape
题意
在一个 N×M 的网格中不重复地填入 1 到 N×M 的整数,使得第 i 行的最大值为 Ai,第 j 列的最大值为 Bj,求方案数。对 109+7 取模。
N,M≤1000
题解
将 A,B 从小到大排序,显然不影响答案。
从大到小填数,分为若干种情况:
- 若当前数是超过两行或超过两列的最大值,则一定无解。
- 若当前数是恰好一行和一列的最大值,则必然填在交界处。
- 若当前数是恰好一行或恰好一列的最大值,则必然填在该行或该列。
- 否则,该数可以填在最大值大于等于当前数的任意位置。
时间复杂度 O(NM)。
代码
E - Connecting Cities
题意
有一张 N 个点的无向完全图,第 i 个点有点权 Ai。定义一条边 (i,j) 的边权为 ∣i−j∣×D+Ai+Aj。求最小生成树权值。
N≤2×105
题解
直接套用 Boruvka 算法。
每次合并时,对于每个点 i,可以对 j<i 和 j>i 两种情况分别求出不在同一连通块的最小边。
只需要正反扫一遍,维护最小值和与最小值不在同一连通块的最小值即可。
时间复杂度 O(Nα(N)logN)。
代码
F - Paper Cutting
题意
有一个 (H+1)×(W+1) 的网格,有 H 条水平线和 W 条垂直线。
你需要执行 K 次操作,每次沿一条水平线或垂直线将网格切开。定义一次操作的权值为做完该操作后网格被分成的块数。
定义一个操作序列的权值为 K 次操作的权值和。
求所有操作序列的权值之和。对 109+7 取模。
H,W≤107
题解
考虑求出第 k 次操作对答案的贡献,为 k!(K−k)!(K−kH+W−k)i=0∑k(iH)(k−iW)(i+1)(k−i+1)
考虑优化后面部分,有 = = i=0∑k(iH)(k−iW)(i+1)(k−i+1)(k+1)i=0∑k(iH)(k−iW)+i=0∑ki(k−i)(iH)(k−iW)(k+1)(kH+W)+HW(k−2H+W−2)
时间复杂度 O(H+W)。
代码