JXOI2018做题笔记

发现自己不会T3可以退群了

排序问题(组合、模拟)

可以发现Gobo Sort相当于在所有排列中随机选择一个,所以当第\(i\)个数出现次数为\(a_i\)时,期望的Sort次数就是\(\frac{(n+m)!}{\prod\limits_{i=1}^{10^9} a_i!}\)

我们希望Sort次数尽可能大,也就是能够让\([L,R]\)内的\(a_i\)尽可能平均。我们把所有\(a_i \neq 0 , i \in [L,R]\)的所有\(a_i\)扔进小根堆,每一次pop堆顶考虑其余的所有数是否能够加到当前堆顶的\(a_i\)的个数,如果不能就把剩下的平摊。

代码

游戏(线性筛、组合)

实际会对最后答案产生影响的数\(x\)一定会满足\([l,r]\)内不存在比\(x\)小的\(x\)的因子。

所以通过线性筛先求出所有数的最小质因子,就可以求出所有会对答案产生影响的数,那么现在就是要求求出这些数中最后一个出现的数的出现位置的总和。

考虑枚举最后一个数出现的位置\(x\),那么\([x+1,len]\)里全部都是不产生影响的数,那么我们可以先选定后面\(y\)个数是不产生影响的数、前面乱排,减去后面\(y+1\)个数是不产生影响的数的方案数,就是从后往前第\(y+1\)个数是最后一个对答案产生影响的数的方案数。

代码

守卫(DP)

不会做qwq

考虑:对于一个区间\([l,r]\)\(r\)位置一定会放一个保镖,把\(r\)所能够看到的所有位置删掉之后又会形成若干个区间,这些区间的右端点和右端点右边的点中一定要放一个保镖,这就变成了一个子问题。

所以可以考虑DP。设\(f_{i,j}\)表示区间\([i,j]\)的答案,转移先把所有\(j\)能看到的点拿出来,假设形成了区间\([l_1,r_1],[l_2,r_2],...,[l_k,r_k]\),那么转移就是\(f_{i,j} = 1 + \sum\limits_{i=0}^k \min(f_{l_i,r_i} , f_{l_i,r_i+1})\)

这样转移是三方的不够优秀,但是注意到对于区间\([i,j]\)的不能看到的区间一定是区间\([l,j](l<i)\)的看不到的区间的子集,所以可以先固定右端点扫左端点,对于已经形成的不能看见的区间直接将答案贡献进去,这样复杂度就降为\(O(n^2)\)

代码

posted @ 2019-06-09 09:49 CJOIer_Itst 阅读(...) 评论(...) 编辑 收藏