【CF886E】Maximum Element

题意:小P有一个1-n的序列,他想找到整个序列中最大值的出现位置,但是他觉得O(n)扫一遍太慢了,所以它采用了如下方法:

1.逐个遍历每个元素,如果这个元素比当前记录的最大值大,则令最大值等于当前元素,并令cnt=0
2.如果这个元素没有当前元素大,则cnt++。
3.如果cnt=k,则返回当前最大值

现在小P想知道有多少种序列在使用他的方法时会得到错误的答案。为了简化问题,我们假定原序列是一个1-n的排列。即我们要求的是:给定n和k,有多少个1-n的排列,在使用上述算法时,会得到错误的答案。

n,k<=10^6

题解:好难的DP题。

令f[n]表示1-n的排列中,$a_n=n$且能得到错误答案的方案数。显然当n<=K时f[n]都是0。

考虑枚举n-1的出现位置,如果n-1的出现位置在[1,n-k-1]中,那么这样的排列一定是错误的。这样的方案数是(n-2)!*(n-k-1)。

如果n-1在[n-k,n-1]中,那么如果答案是错误的,最大值只能是前n-2个数中的一个。设n-1的位置是j,那么我们将n-1和它前面的数看成一个新的序列,那么这个序列错误的方案数就是f[j]。又由于前面的j个数其实可以在n-2里随便取,所以方案数其实是$f[j]\frac {(n-2)!} {(j-1)!}$。

所以DP方程:$​f[n]=(n-2)!(n-k-1)+\sum\limits_{j=n-k}^{n-1}f[j]\frac{(n-2)!}{(j-1)!}$

用前缀和维护$\frac{f[j]}{(j-1)!}$即可。

答案是什么呢?仿照上面的推导过程可以知道$ans=\sum\limits_{i=k+1}^nf[i]\frac{(n-1)!}{(i-1)!}$。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn=1000010;
const ll P=1000000007;
int n,m;
ll jc[maxn],ine[maxn],jcc[maxn],f[maxn],s[maxn];
int main()
{
scanf("%d%d",&n,&m);
int i;
ine[0]=ine[1]=jc[0]=jc[1]=jcc[0]=jcc[1]=1;
for(i=2;i<=n;i++) jc[i]=jc[i-1]*i%P,ine[i]=P-(P/i)*ine[P%i]%P,jcc[i]=jcc[i-1]*ine[i]%P;
for(i=m+2;i<=n;i++) f[i]=(i-m-1+s[i-1]-s[i-m-1]+P)*jc[i-2]%P,s[i]=(s[i-1]+f[i]*jcc[i-1])%P;
printf("%I64d",s[n]*jc[n-1]%P);
return 0;
}

【CF886E】Maximum Element DP的更多相关文章

  1. 【CF886E】Maximum Element

    题目 考虑正难则反,答案即为\(n!-\text{返回值为n的排列数}\) 一个排列的返回值为\(n\),当且仅当在\(n\)出现之前没有一个数后面有连续\(k\)个小于它的数 设\(f_i\)表示\ ...

  2. 【CF888E】Maximum Subsequence(meet in the middle)

    [CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...

  3. 【CF888E】Maximum Subsequence 折半搜索

    [CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...

  4. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  5. 【题解】剪纸条(dp)

    [题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回 ...

  6. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  7. 【BZOJ2213】[Poi2011]Difference DP

    [BZOJ2213][Poi2011]Difference Description A word consisting of lower-case letters of the English alp ...

  8. 【BZOJ-1068】压缩 区间DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1001  Solved: 615[Submit][Status][ ...

  9. 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3396  Solved: 1434[Submit][Sta ...

随机推荐

  1. PowerDesigner使用技巧(转载)

    1.如何打开PowerDesigner 快捷工具栏 paletteTools(工具栏)--> customsize toolbars(自定义工具栏)-->勾选 palette(调色板) 2 ...

  2. …gen already exists but is not a source folder. Convert to a source folder or rename it [closed]

    Right click on the project and go to "Properties" Select "Java Build Path" on th ...

  3. 针对降质模型中的模糊SR

    (PDF) Deep Plug-and-Play Super-Resolution for Arbitrary Blur Kernels https://www.researchgate.net/pu ...

  4. 系统windows进程的资源分配

    http://www.captaincodeman.com/2011/02/27/limit-mongodb-memory-use-windows/ CaptainCodeman About Arch ...

  5. jquery.fileupload插件 ie9下不支持上传

    根据https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support The following browsers support ...

  6. atom中vue高亮支持emmet语法

    vue高亮插件: language-vue 支持emmet语法: 文件>用户键盘映射>keymap.cson添加: 'atom-text-editor[data-grammar~=&quo ...

  7. PHP代码审计笔记--弱类型存在的安全问题

    0x01 前言 PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型. 弱类型比较,是一个比较蛋疼的问题,如左侧为字符串,右侧为一个整 ...

  8. FFmpeg X264的preset和tune

    鉴于x264的参数众多,各种参数的配合复杂,为了使用者方便,x264建议如无特别需要可使用preset和tune设置.这套开发者推荐的参数较为合理,可在此基础上在调整一些具体参数以符合自己需要,手动设 ...

  9. Nginx 代理

    如下,配置 Nginx 成为一台代理服务器 [root@localhost ~]$ cat /usr/local/nginx/conf/vhost/proxy.conf server { listen ...

  10. MySQL按照汉字拼音首字母排序

    按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序: 如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字37 ...