20241008题解

提高组模拟赛

czyarl 2024.10

T1 graph

知识点:图论,计数,暴力

这题就是让你来统计四元环个数。

注意到边数很少,所以我们可以干脆直接枚举两条不相邻的边,然后暴力判断这时的四个点是否构成四元环。

一些细节:需要妥善处理重边自环,同时需要判断连通性,所以不如直接用一个邻接矩阵来辅助一下。

复杂度 \(O(m^2)\)

T2 rpg

知识点:二分答案,细节

可以轻松意识到二分答案:很显然具有单调性,而且想要判断一个答案是否可行也很简单。

具体怎么判断:记录那些属性不足的一共缺x点,那些属性多的一共多y点,那么如果x<=y*(1-p)就显然是可行的。

二分答案已经可以过题了。

当然,如果想要得到精确答案,也是有办法的:把所有属性从小到大排序,那么不足的就是一段前缀,多的就是一段后缀。你可以扫一遍就知道最终答案中前多少个不足,后多少个盈余。知道这个个数之后,就可以列方程直接算了。

这个方法唯一的问题就是要判断一些边界情况,比如损耗率为1的时候就可能出现除零的问题。

原题:CF68B

T3 king

知识点:计数,细节

最核心的观察是,SSR的个数不会很多:准确来说,是 \(2^{10}-2\) 个。

所以我们直接把所有SSR处理出来,然后每次枚举是哪连续的k个,算算左右端点恰好覆盖这几个的方案数即可。

一个细节:如果你的统计方式是,计算x<=y的时候的方案数,再计算x>=y的时候的方案数,需要减去x=y的情况(这个只会在k=1时出现)

T4 permutation

知识点:线段树上二分,结论

首先你要得到一个结论:从第一个位置开始依次考虑,每次放置当前能放的最大的数字,这样只要有解就一定能得到字典序最大的解。

先来思考什么时候第一个位置能放i:

  1. \(b_i=0\)
  2. 放了 \(i\) 之后,\(1,2,...,i-k\) 左边还需要的数字都会少一个,所以要保证 \(b_1,...,b_{i-k}\) 全都不为0。

放了第一个数字之后,更新一下剩余位置的b,然后继续做就行了。

想明白了这件事,会发现我们一直这么操作显然是安全的。但是严谨起见,我们需要进一步说明一下,为什么只要有解,这么做一定能操作 \(n\) 次,而不会某一次发现没得操作了。

反证法,假如存在一个有解的B,按照字典序最大的操作到第 \(i\) 个没有空余的0了,记此前序列为 \(\{a_1,...,a_{i-1}\}\) 。既然B有解,那么就有个i步的操作序列 \(\{\hat a_1,...,\hat a_{i}\}\) 。我们取出后者第一个不在 \(\{a_1,...,a_{i-1}\}\) 中的元素 \(\hat a_{j}\) ,很显然可以在 \(\{a_1,...,a_{i-1}\}\) 后面接上 \(\hat a_{j}\) 。矛盾,所以假设不成立。

这里证明的核心在于,延后操作,不会对其效果产生影响。

可以暴力模拟这个过程,复杂度 \(O(n^2)\)

或者可以用线段树上二分加速,复杂度 \(O(n\log n)\) ,相对经典不再赘述。具体做法参见std。

posted @ 2024-10-08 14:06  赵梓烨  阅读(18)  评论(0编辑  收藏  举报