10.17 模拟赛
T1
直接看题解吧,懒得写了,和前天T2的思路差不多
cpp
1 |
|
T2
看数据范围会考虑网络流。
考虑对于两个 B 原子,如果满足条件一定一个在奇数行一个在偶数行。于是我们把奇数行的 B 放左边,偶数行放右边,然后对于所有 A 拆点连边跑最大流即可。
cpp
1 |
|
T3
这题的毒瘤就在于精度。。
首先将范围离散化,然后对于一个数考虑它的所有小区间来计算答案。
因为如果考虑小区间就不会有区间相交的情况了,对于每个小区间再枚举所有数,然后就有几种概率,
其中橙色的是小区间,黑色是大区间。
用f[i][j][k]表示当前在处理i区间,一共有j个位置一定在这个区间前面,有k个位置是在这个区间内随机的概率。
那么f[i][j][k]=f[i−1][j−1][k]×A+f[i−1][j][k−1]×B+f[i−1][j][k]×C
如何统计答案呢?如果用 ans
来记录枚举的这个数是 rank i
的概率,可以枚举在这个数字之前的个数 p 以及在这个数字之中的个数。由于在这个数字中出现是随机的,所以 rank p ~ p + k
的概率其实是一样的,就是dp值除以k+1。这里的加可以用差分最后在输出前缀和,其实没有也可以,复杂度不变。
总复杂度大概是O(n5)
据说不考虑精度可以有O(n4)做法。
cpp
1 |
|