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:
- \(b_i=0\);
- 放了 \(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。