Processing math: 2%

模拟测试52

T1:

  考虑二分答案。

  然后问题转化为:求平均数小于某值的区间个数。

  设当前二分值为x,每个区间的平均数可以写成:

    \begin{array}{rl} (s[i]-s[j])/(i-j) &<& x \\ (s[i]-s[j]) &<& (i-j)*x \\ s[i]-i*x &<& s[j]-j*x \end{array}

  离散化后可以树状数组维护。

  时间复杂度O(nlog^2n)

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

  很好理解,每次尝试在后面添加一个新的颜色或继承一个已有的颜色。

  这样球出来的方案数是所有颜色集合的方案数总和,对于一种颜色集合,方案数为\frac{g[n][i]}{C_p^i}

  dp[i][j]的初状态也有了,即:

    dp[1][i]=g[n][i]

  然后尝试求出f[i][j]

  先枚举ij,再枚举并集大小k,并集大小必须大于\max(q,i,j),且小于\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)

posted @   hz_Rockstar  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版
点击右上角即可分享
微信分享提示