【BZOJ4361】isn(动态规划,容斥)

题面

BZOJ

题解

首先我们如果确定了一个不降序列,假设它的长度为\(i\),

那么可行的方案数为\(i*(n-i)!\),但是这样有一些非法的情况,即删掉最后一个数之前已经是有序的了。

那么设\(g[i]\)表示长度为\(i\)的不降序列的总数

因为所有长度为\(i\)的不降序列一定包含在长度为\(i+1\)的不降序列之中

如果先构成了一个长度为\(i+1\)的不降序列,再删掉了一位,那么这样是不合法的。

所以长度为\(i\)的不降序列的贡献为:

\[g[i]*(n-i)!-g[i+1]*(n-i-1)!*(i+1)
\]

即先构成了一个长度为\(i+1\)的不降序列,再枚举删去了哪个数构成了长度为\(i\)的不降序列。

至于\(i\)怎么算,可以设\(f[i][j]\)表示以\(i\)结尾,长度为\(j\)的不降序列的个数

\(f[i][j]=\sum f[k][j-1](a[k]\le a[i])\)

树状数组优化一下就好了

时间复杂度\(O(n^2logn)\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define RG register
#define MAX 2002
#define MOD 1000000007
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int a[MAX],n,S[MAX],len;
int f[MAX][MAX],g[MAX];
int c[MAX],jc[MAX],ans;
int lb(int x){return x&(-x);}
void modify(int x,int w){while(x<=len)add(c[x],w),x+=lb(x);}
int getsum(int x){int ret=0;while(x)add(ret,c[x]),x-=lb(x);return ret;}
int main()
{
n=read();jc[0]=1;
for(int i=1;i<=n;++i)jc[i]=1ll*jc[i-1]*i%MOD;
for(int i=1;i<=n;++i)a[i]=S[++len]=read();S[++len]=0;
sort(&S[1],&S[len+1]);len=unique(&S[1],&S[len+1])-S-1;
for(int i=0;i<=n;++i)a[i]=lower_bound(&S[1],&S[len+1],a[i])-S;
f[0][0]=1;
for(int j=1;j<=n;++j)
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;++i)
{
modify(a[i-1],f[i-1][j-1]);
f[i][j]=getsum(a[i]);
add(g[j],f[i][j]);
}
}
add(ans,g[n]);
for(int i=n-1;i;--i)
add(ans,(1ll*g[i]*jc[n-i]%MOD-1ll*g[i+1]*jc[n-i-1]%MOD*(i+1)%MOD+MOD)%MOD);
printf("%d\n",ans);
}

【BZOJ4361】isn(动态规划,容斥)的更多相关文章

  1. 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学

    [BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...

  2. bzoj4361:isn(dp+容斥+树状数组)

    题面 darkbzoj 题解 \(g[i]\)表示长度为\(i\)的非降序列的个数 那么, \[ ans = \sum_{i=1}^{n}g[i]*(n-i)!-g[i+1]*(n-i-1)!*(i+ ...

  3. 【BZOJ4361】isn 动态规划+树状数组+容斥

    [BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...

  4. 【BZOJ5287】[HNOI2018]毒瘤(动态规划,容斥)

    [BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就 ...

  5. 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)

    [LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...

  6. 【BZOJ2024】舞会(动态规划,容斥,高精度)

    [BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...

  7. 【BZOJ2839】集合计数(容斥,动态规划)

    [BZOJ2839]集合计数(容斥,动态规划) 题面 BZOJ 权限题 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使 ...

  8. 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)

    [BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...

  9. 【BZOJ3294】放棋子(动态规划,容斥,组合数学)

    [BZOJ3294]放棋子(动态规划,容斥,组合数学) 题面 BZOJ 洛谷 题解 如果某一行某一列被某一种颜色给占了,那么在考虑其他行的时候可以直接把这些行和这些列给丢掉. 那么我们就可以写出一个\ ...

随机推荐

  1. Migrating to WebSphere 9

    Migrating to WebSphere 9 Make a migration plan Requirements Migrate WebSphere profiles into the new ...

  2. youtube视频下载和搬运的方法

    youtube全球最大的视频网站, 全世界每天有三分之一的网民在youtube上观看视频, 可是大部分人不知道, 在这些网民有一小部分人是依靠youtube生存的, 他们上传视频到youtube, y ...

  3. Linux 安装Redis<集群版>(使用Mac远程访问)

    阅读本文需要先阅读安装Redis<准备> 一 架构细节 所有的redis节点彼此互联(PING-PONG机制) 内部使用二进制协议优化传输速度和带宽 节点的fail是通过集群中超过半数的节 ...

  4. url乱码问题

    //url乱码,有时候要解码2次才能成功 String url=URLDecoder.decode(URLDecoder.decode(returnUrl, "UTF-8"),&q ...

  5. JAVA学习笔记--策略设计模式与适配器模式

    一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分.策略就是传递进去的参数对象,它包含要执行 ...

  6. Python爬虫入门(7):正则表达式

    下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串” ...

  7. java运行时内存分类

    主要有java栈(虚拟机栈), 堆 ,方法区. 线程私有: 栈: 每个方法执行的时候 都会同时创建一个栈桢 Stack Frame 用于存储  局部变量表, 操作数栈,动态链接, 方法出口等信息 线程 ...

  8. git实验

    四.实例应用 应用1.现有项目移植到git代管 进入目标项目,进行git初始化: 初始化:git init 修改config:git config -- local user.name '名称'  和 ...

  9. 大前端全栈CSS3移动端开发

    作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 本节课学习视频来源:https://ww ...

  10. “Hello World!”团队——Final发布用户使用报告

    博客内容: 1.用户体验报告表 2.用户评论截图 3.总结 一.用户体验报告表 用户使用报告 用户类别 用户姓名(化名) 性别 用户职业 使用频次 用户评论 新增用户 小小静 女 中学信息技术老师 8 ...