模拟测试52
T1:
考虑二分答案。
然后问题转化为:求平均数小于某值的区间个数。
设当前二分值为x,每个区间的平均数可以写成:
(s[i]−s[j])/(i−j)<x(s[i]−s[j])<(i−j)∗xs[i]−i∗x<s[j]−j∗x
离散化后可以树状数组维护。
时间复杂度O(nlog2n)
T2:
设dp[i][j]为填了前i列,最后一列有j种颜色的方案数。
然后我们发现转移系数只与转移前后第二维的大小有关。
我们设这个值为f[i][j],代表第二维从i转移到j的方案数。
首先,我们需要知道用固定数量的颜色涂满一列的方案数。
设g[i][j]为用j个颜色涂满i个格的方案数。
然后这个可以DP,g[0][0]=1:
g[i][j]=g[i−1][j−1]∗(p−(j+1))+g[i−1][j]∗j
很好理解,每次尝试在后面添加一个新的颜色或继承一个已有的颜色。
这样球出来的方案数是所有颜色集合的方案数总和,对于一种颜色集合,方案数为g[n][i]Cip。
dp[i][j]的初状态也有了,即:
dp[1][i]=g[n][i]
然后尝试求出f[i][j]。
先枚举i,j,再枚举并集大小k,并集大小必须大于max,且小于\min(p,i+j)。
j想要满足条件,就要从i包含的元素中选i+j-k个,在从不被i,包含的元素中选k-i个。
可以得出f[i][j]的计算式。
f[i][j]=\frac{g[n][j]}{C_p^j} \sum \limits_{k=\max(q,i,j)}^{\min(p,i+j)} C_i^{i+j-k} C_{p-i}^{k-i}
然后可以DP求出答案,时间复杂度O(n^2m+n^3)
dp[i][j]=\sum \limits_{k=1}^p dp[i-1][k]*f[k][j]
这种形式的类似矩阵乘法,可以用矩阵快速幂优化。
时间复杂度O(n^3logm)
T3:
本题修改的是数列中的数。
我们可以转换思路,用主席树将询问权值存下。
由于询问都是针对区间,可以用广义差分,再用主席树维护前缀和。
对于每个权值,在他的位置的前缀树上查询小于他的值的个数即可。
由于只涉及到一个点的修改,暴力修改答案即可。
时间复杂度O(nlogn)
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步