Loading

【题解】UOJ Round #6

// created on 22.09.29

A. 破解密码

直接做就行了,当 \(26^n\not\equiv 1\) 时肯定有唯一解。

\(26^{n}\equiv 1\) 时怎么办?发现此时直接转成 \(26\) 进制数一定合法。

B. 智商锁

分四个部分,每部分随机生成 \(s\) 张生成树数量非 \(0\) 的图。

组合四个部分考虑 meet in middle,用 \(O(s^2)\) 的代价,一边哈希表,一边枚举。选取 \(s=10^3\) 差不多就行,生成树用矩阵树定理求,复杂度可以接受。

考虑正确性:相当于在 \([1,998244353]\) 中随机了 \(s^4=10^{12}\) 次。同时因为每个部分不同生成树个数的级别远大于模数,因此都可以看成随机数。

C. 懒癌

怎么真的有人把蓝眼睛红眼睛出到 oi 里来。

考虑令 \(f_{S}\) 表示 \(S\) 中的人有病,其余没病,最晚开枪时间。对于 \(i\) 来说,如果其生病了,可以假设自己没有生病,然后考虑所有的 \(f_S\),则其会在 \(\max f_S+1\) 天开枪自杀。

那么对于 \(f_S\) 的转移就是:枚举每一个生病的 \(i\),再从 \(i\) 未知的集合 \(T\) 中选取一个子集认为 \(T\) 中的人生病了,最后用 \(\max f_{T+K}+1\) 转移(其中 \(K\) 是已知集合)。

\(f\) 转移成环时,环内元素肯定都没有结局。接下来考虑证明 \(U\subseteq V\) 时,\(f_{U}\leq f_{V}\):如果他们的子集同样满足这个性质,根据转移式的定义肯定就满足。这个就是归纳的模型。

考虑转移成环,我们考虑原图的反图 \(G'\)。对于 \(G'\) 中的一个强连通分量,如果选择了至少两个点,那么可以通过删除其中一个,走一条出边,不断进行这个过程,回到原点。因此对于 \(f_S\),只有在每个强连通分量最多选一个点时,才有可能有结局。

同时根据前面的规律,我们的转移也是唯一的:对于未知集合,全部当成生病的就行了。同时,因为初始状态是 \(f_0\),所以如果对于 \(S\) 中有点落在某个强连通分量中了,就肯定走不出去了。因此我们将所有的强连通分量删除。剩下的图肯定是 DAG 。

因此对于一个 \(S\),相当于每个时刻,每个点的唯一决策是往下下放(同时也是最大决策)。而我们要求的,是我们考虑每次选取最优的 \(i\in S\) 满足新状态到达答案的时间最小,然后走向新状态。

从一个点出发的最优决策就是按层逐一决策,这样每个点被恰好操作一次,是最优方案。对于 \(S\) 来说,按层决策,肯定也是最优方案。这样所有能被 \(S\) 到达的点都会恰好被到达一次。我们考虑一个被到达点的贡献,就只需要求出有多少点可以到达其。可以压位然后 topsort 完成。

而对于第二问,最早的点因当是 \(S\) 最优的决策点。于是对于那些,祖先没被选过的点,都是必然自己要走出一步的。这一步的顺序没有区别。因此所有这样的点都是最优点。答案的计算同样和能到达 \(S\) 的点数有关。

提交记录:Submission #585538 - Universal Online Judge (uoj.ac)

实现细则是需要倒着做,因为如果一个点会进入一个环,这个点将要被删掉。所以从终点倒着做就行了。

总结一下:这种题我有一个思维弊端就是会去人脑模拟 .. 然后找规律之类的。但其实直接设计一个抽象的状态找到转移描述问题就行了,这种情况我应该是见过的。而对于 DP 的部分还是性质观察突破,比如转移太多,我们不妨猜测转移方向,通过简单猜测与证明我们找到了唯一转移。接着我们考虑无解的情况,将转移具象化后正好对应上了反图,再利用简化转移的结论得出反图强连通分量一定非法。最后将问题简化至 DAG,此时再考虑游走就形象化很多,接下来的部分都比较简单了。

关键点大概在于突破转移:突破契机是我们发现转移太复杂,从而进行一些有理猜测,简化、具象化转移。从而得到一个较为显然,不过确实需要观察的结论。再利用这个结论化简原图(按照做题思路,我们去解决无解的情况,反而正好化简到了 DAG)。中间有个转反图,理由是我们的转移,在具象化后是沿着反图的边转移的,那么不妨将反图建出来观察。

posted @ 2022-09-29 20:09  Qiuly  阅读(69)  评论(0编辑  收藏  举报