2018 Multi-University, HDU Day 9
两个半小时签完到,最后两个 Last Hour。人生大起大落真刺激。
Problem A
Solved by zerol & kblack. 02:33 (+)
题意:在 n×m 的方格中填 1~nm 的数,使得只有一个数是它所在行列的最大值。
题解:显然那唯一一个数就是 nm。考虑从大到小依次填数,每个数肯定得填在一个之前填过的数的同一行或者同一列。dp[i][j][k] 表示已经填了 k 个数,已经有 i 行 j 列有数字的方案。转移有两种,一种是新开一行,一种是新开一列,还有就是填到 i 行 j 列的交叉处。
无比艰难的签到。
Problem B
Solved by kblack. 04:43 (+3)
题意:给一个 $n \times m$ 的 01 阵,一行删一个,错位不能超过 $K$ 问压缩掉删除的位置后组成的图案有几种。
题解:首先考察一行的情况,发现只有连续的字符中删除任意一个才能构成等价类。构造一个 $O(n m^3)$ 的算法,直到 $x$ 行,上一行选择 $[l, r]$ 的某种不同图案有 $dp[l, r]$ 种,考虑转移,先将区间扩展成 $[l-K, r+K]$ 然后用下一行的相同字符的区间去截,每个最多截出 $m$ 个区间,而且都是不同的图案,这么直接转移是 $O(m^3)$ 的。考虑优化这个过程,其实我们并不关心具体的区间,只要直到在某个范围里就会有若干种图案可以转移就好了。将区间拆成开闭,对于某个位置开头和结尾的数量分别记录。在扫描当前行前,先将所有开始标记左移动 $K$ 个位置,结束标签右移 $K$ 个位置,然后扫描过去,记录开头和结尾图案数的前缀和,当遇到当前行的分割点(颜色不同)的时候,我们只要把之前为闭合的区间(前缀和之差)手动闭合一下,下一个颜色开头的地方手动开启一下,就能轻松地维护与之前地区间等价的标记了,最后答案是最后一样的开头标记的和。
Problem D
Solved by kblack. 01:29 (+1)
题意:和一个随机策略电脑玩限定猜拳©。
题解:似乎你随不随机都一样,那么就简单了,随便乘乘除除就好了。
kblack: 解决的关键一步在于发现样例四中 $19$ 是 $a+b+c$ 的倍数,将分数还原以后凑一下就发现公式了。
Problem J
Solved by ultmaster. 04:44 (+2)
题意:比较两个 $\log \cdots \log n ^{(\log \cdots \log n)^{(\log \cdots \log n)}}$ 的阶数。
题解:比赛的时候一通操作,动用了 Mathematica 观察了若干式子之后得出来一张图。在修了一堆 bug 之后发现算法根基就不大对,然后改改改,勉强 AC。
比赛后回顾了一下发现了半天的结论是显然的,如果更进一步的话,会发现完全没有这么复杂。
首先记 $\log \cdots \log n$ ($i$ 个 log) 为 $l(i)$ 两个式子都取 log 之后阶数的关系是不变的,会得到 $l(a) ^ {l(b)} l(c)$ 的形式。
记 $f(a,b) = l(a)^{l(b)}$,注意到 $l(c) \sim f(c,\infty)$。考虑一个更普适的问题比较两个 $f(a,b)f(c,d)$ 的阶数。只要两个里面阶数比较大的那个 $f$ 拿出来比较,如果相等,再比较小的即可。这又带来另一个问题就是如果比较两个 $f(a,b)$ 的阶数。注意到 $f(a,b) = l(a)^{l(b)}$,再取一次 log 即可。
注意处理一下 $\infty + 1 = \infty$。
Problem K
Solved by zerol. 00:47 (+)
温暖的签到。
zerol:那么迟才签到是因为看错题了。