【BZOJ4361】isn(动态规划,容斥)
【BZOJ4361】isn(动态规划,容斥)
题面
题解
首先我们如果确定了一个不降序列,假设它的长度为\(i\),
那么可行的方案数为\(i*(n-i)!\),但是这样有一些非法的情况,即删掉最后一个数之前已经是有序的了。
那么设\(g[i]\)表示长度为\(i\)的不降序列的总数
因为所有长度为\(i\)的不降序列一定包含在长度为\(i+1\)的不降序列之中
如果先构成了一个长度为\(i+1\)的不降序列,再删掉了一位,那么这样是不合法的。
所以长度为\(i\)的不降序列的贡献为:
\]
即先构成了一个长度为\(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(动态规划,容斥)的更多相关文章
- 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...
- bzoj4361:isn(dp+容斥+树状数组)
题面 darkbzoj 题解 \(g[i]\)表示长度为\(i\)的非降序列的个数 那么, \[ ans = \sum_{i=1}^{n}g[i]*(n-i)!-g[i+1]*(n-i-1)!*(i+ ...
- 【BZOJ4361】isn 动态规划+树状数组+容斥
[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...
- 【BZOJ5287】[HNOI2018]毒瘤(动态规划,容斥)
[BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就 ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- 【BZOJ2024】舞会(动态规划,容斥,高精度)
[BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...
- 【BZOJ2839】集合计数(容斥,动态规划)
[BZOJ2839]集合计数(容斥,动态规划) 题面 BZOJ 权限题 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使 ...
- 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)
[BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...
- 【BZOJ3294】放棋子(动态规划,容斥,组合数学)
[BZOJ3294]放棋子(动态规划,容斥,组合数学) 题面 BZOJ 洛谷 题解 如果某一行某一列被某一种颜色给占了,那么在考虑其他行的时候可以直接把这些行和这些列给丢掉. 那么我们就可以写出一个\ ...
随机推荐
- jquery.validate使用 - 5
一些常用的验证脚本 不会写js了,只能从网上找一些常用的验证脚本. // 手机号码验证jQuery.validator.addMethod("mobile", function(v ...
- Eclipse 使用过程中的问题及解决方法
1.Eclipse中java文件和jsp字体大小设置 1.更改所有文件的字体显示大小过程: Window->preferences->General->Appearance-> ...
- Oracle用户和模式,表空间
oracle 用户与表空间关系 oracle用户与表空间关系用户=商家表=商品表空间=仓库1. 1个商家能有很多商品,1个商品只能属于一个商家2. 1个商品可以放到仓库A,也可以放到仓库B,但不能同时 ...
- katalon系列十:Katalon Studio自定义关键字之拖拽
Katalon Studio自带关键字“Drag And Drop To Object”,可以在这个网站实践:http://jqueryui.com/droppable/#default 不过“Dra ...
- 深度学习-tensorflow学习笔记(2)-MNIST手写字体识别
深度学习-tensorflow学习笔记(2)-MNIST手写字体识别超级详细版 这是tf入门的第一个例子.minst应该是内置的数据集. 前置知识在学习笔记(1)里面讲过了 这里直接上代码 # -*- ...
- Hibernate查询的六种方式
Hibernate查询的六种方式 分别是HQL查询,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询. 如果单纯的使用hibernate ...
- Centos7 Zabbix监控部署
Zabbix监控 官方文档 https://www.zabbix.com/documentation/3.4/zh/manual https://www.zabbix.com/documentatio ...
- Python20-Day01
简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释 编译型语言是一种以编译器来实现的编程语言,优缺点:执行速度快,调试麻烦 编译型语言:Java,Go,C,C++ 解释性 ...
- 《JavaScript》JS中的跨域问题
参考博客:https://www.cnblogs.com/yongshaoye/p/7423881.html
- Java throw try catch
public class Runtest { public static void main(String[] args) { // TODO Auto-generated method stub T ...