【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 洛谷 题解 如果某一行某一列被某一种颜色给占了,那么在考虑其他行的时候可以直接把这些行和这些列给丢掉. 那么我们就可以写出一个\ ...
随机推荐
- 查看Linux系统版本的命令
1.lsb_release -a,即可列出所有版本信息: [root@S-CentOS ~]# lsb_release -a LSB Version: :base-4.0-amd64:base-4.0 ...
- 接口自动化·分享·第二篇·你必须了解的HttpRequest和HttpResponse
完成一个接口调用其实就是完成了一次http请求,所以你必须要清楚一个http请求的组成. 一次完整的请求包含:请求+响应. 一.HttpRequest请求对象 要调用一个接口,首先要准备的是一个请求对 ...
- 《深入分析Java Web技术内幕》读书笔记之JVM内存管理
今天看JVM的过程中收获颇丰,但一想到这些学习心得将来可能被遗忘,便一阵恐慌,自觉得以后要开始坚持做读书笔记了. 操作系统层面的内存管理 物理内存是一切内存管理的基础,Java中使用的内存和应用程序的 ...
- 【坚持】Selenium+Python学习之从读懂代码开始 DAY2
2018/05/10 [来源:菜鸟教程](http://www.runoob.com/python3/python3-examples.html) #No.1 # 二次方程式 ax**2 + bx + ...
- 减少Java垃圾的产生,降低内存使用量
1.尽量少使用静态的变量,因为它会一直占用内存, 2.尽量少使用String字符串去做拼接,相加.因为String是定长的每次相加都会产生新的临时对象,生成垃圾对象,尽量使用StringBuffer, ...
- cinder创建volume的流程-简单梳理
1. cinder-api接收到创建的请求,入口:cinder.api.v2.volumes.VolumeController#create,该方法主要负责一些参数的重新封装和校验,然后调用cinde ...
- Visiting a Friend(思维)
Description Pig is visiting a friend. Pig's house is located at point 0, and his friend's house is l ...
- 软件工程第七周psp
1.PSP表格 类别 任务 开始时间 结束时间 中断时间 delta时间 立会 汇报昨天的成绩,分配任务,部署计划 10月27日18:00 10月27日18:36 0 36分钟 准备工作 查阅有关资料 ...
- idea的快捷键(复制)
IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Sh ...
- 软工实践-Alpha 冲刺 (6/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成了主界面的基本布局 ...