zoukankan      html  css  js  c++  java
  • 模拟测试52

    T1:

      考虑二分答案。

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

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

        egin{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]$。

      先枚举$i$,$j$,再枚举并集大小$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)$

  • 相关阅读:
    Mybatis-Plus select不列出全部字段
    git合并之 merge和rebase
    git
    springboot缓存开发
    关于Maven打包
    邮件发送模型及其Python应用实例
    Python 日志模块的定制
    python 解析 XML文件
    有限状态机FSM详解及其实现
    动态规划
  • 原文地址:https://www.cnblogs.com/hz-Rockstar/p/11598074.html
Copyright © 2011-2022 走看看