Codeforces Round #745 中文题解与总结
Hydroxythio · · 个人记录
题解
在题解前我想先说明一些基本情况。本人目前是高三学生,并没有太多时间来准备题目和题解,给大家带来了诸多不便,对此我深感抱歉,还望大家谅解。此外,Div 2 B, Div1 C,F 并不是我出的,我也没有时间再去做一遍,所以很抱歉无法带来这些题的题解。如果日后CQXYM给了我对应题目的中文题解,我会再进行更新。
D2A CQXYM Count Permutations
一个脑筋急转弯。如果一个排列满足条件,那么我们把它翻转过来一定不满足条件,且这两个排列不同。所以答案是
D1B Mathematics Curriculum
确实这个题的数据范围有点大,理论上
做法是很简单的,设
实际上有很多状态用不到。从另一个角度理解,我们是在数恰有
标程加了一些剪枝,但实际上只要写的是记忆化搜基本上都能过。
D1C Train Maintenance
关于这道题为什么是
我个人认为
考虑对列车按
如果
如果
因此总的时间复杂度是
D1D Subsequence
考虑笛卡尔树。以数组下标为优先级,
化一下式子可得一个子序列的价值为
具体地,设
而最后的答案就是
D1E Railway Construction
很抱歉由于时间并不充足,本题的数据非常水。题解中也有一些细节可能没有提到。
加边不会改变最短路长度,所以如果一条边一开始不在最短路上,那最后也不会在。因此可以先跑一个
注意到如果此时一个点只有一个入度,则这个点一定不满足题目要求。所以每个点至少都应有两个入度。接下来我们证明:每个点都恰有两个入度,且两条入边的起点要么都是点
考虑任意一个点
-
如果
s 和t 中有一个是点1 ,不妨令s 为点1 ,则我们可以选择1 \rightarrow u 和1 \rightarrow t \rightarrow u ,这两条路径显然不交。 -
如果
s 和t 都不是点1 ,首先我们可以任选一条路径1 \rightarrow s ,称这条路径为路径0,根据我们的假设,我们可以找出两条不同的路径1 \rightarrow t ,并且这两条路径自身不相交,分别称它们为路径1和路径2。-
如果路径1和路径2中有一条路径与路径0不相交,则选择这两条路径,此时满足条件。
-
否则路径1和路径2都与路径0相交,则路径0上至少有两个交点,我们取出最靠近点
1 的交点a 和最靠近点s 的交点b 。- 如果
a,b 都在路径1或路径2上,不妨假设它们都在路径1上,如下图所示:
则我们可以选择:路径2,点
1 沿路径0到点a 后沿路径1到点b 最后沿路径0到点s ,由于路径2与后一条路径的三段的每一段都不交,因此满足条件。- 否则
a,b 在不同的路径上,不妨假设a 在路径1上,b 在路径2上,如下图所示:
则我们可以选择:从点
1 沿路径0到a 再沿路径1到t ,从点1 沿路径2到b 再沿路径0到s ,这两条路径同理不交。 - 如果
-
此时我们已经讨论完所有情况,因此结论得证。
于是我们可以得到一个如下单次
这一算法的优化很简单。首先我们倒着执行修改,这样修改只会减小
根据
对于某一被修改的段而言,根据修改值和这一段的
- 修改值此前就是这一段的最小值。这样的操作可能会进行若干次,但是它不会修改
val 数组,因此我们可以将多次操作合并为一次,用线段树查询并更新答案。因此单次修改中此类操作最多执行一次。 - 修改值此前是这一段的次小值。考虑到每一段的次小值一定不同,因此单次修改中这类操作最多执行一次。
- 修改值此前既不是最小值,也不是次小值。我们将这类操作继续细分:
- 修改值在修改后是该段次小值。考虑下一个段的
val ,如果下一个段的val 的次小值是这个段的最小值,则显然这次修改是最后一次,否则除非这是第一次操作,段数会-1 。因此这类操作要么只会执行一次,要么会使段数-1 。 - 修改值在修改后是该段最小值。我们可以这样考虑:如果当前区间的最小值一直到数组结束都是最小值,则该次操作会把这个段及以后的段全部合并为同一段,因此每次操作均会使段数
-1 。否则当前段的最小值一定会在某一时刻成为次小值,则在这两个段之间的所有段也都会被合并为同一段,因此每次操作还是会使段数-1 。
- 修改值在修改后是该段次小值。考虑下一个段的
因此总的操作次数不超过
总结
下面我要说的并不是为这场比赛辩护,只是单纯的陈述一下个人感受。可能会有很多跟题目无关的东西,如果不感兴趣可以直接跳过。
就像我此前说过的一样,我并没有很多时间来准备这些题目,有很多工作都是CQXYM帮我完成的,在此我想表达对他的感谢。
这道D2A给了我很多感触。个人认为,既然是算法竞赛,而不是编程竞赛,那么参赛者理应具备一定的数学推理能力,想要推导出D2A的结论并不困难。就我个人的OI经历来讲,我最大的一个感受就是算法竞赛对数学能力的要求非常高。但凡是OI学的好的,数学大多都不会差。
关于卡常,我也没有想到这场比赛会被认为对常数优化有很高的要求。现在感觉好像很多我觉得很正常的写法都被算成了常数优化。这方面确实是我考虑不周,希望大家谅解。
关于CF上的风评,你看我头像也知道我其实不太在意我自己被批评,攻击。我现在基本上已经慢慢淡出算法竞赛了,也不知道一年后有没有机会继续我的算法竞赛生涯。可能有些人会问,为什么高三还要花这么多时间来出一场比赛。其实我觉得学了两年竞赛,虽然没有什么荣誉,但是我还是有很多收获。出这场比赛的初衷也是希望能够把一些我得到的一些有价值的方法,经验拿出来给大家分享。也希望能为算法竞赛作出一些贡献。所以尽管你们可能不喜欢这场比赛,但是我希望大家不要对题目抱有偏见而视而不见,而是能客观公正的看待它们。
本来还有一些想说的东西,但我也不是太想在题解下面长篇大论。如果您已经阅读到这里了,我非常感谢您的耐心。再次为我们给大家带来的不便表示抱歉。