BZOJ 4361 isn 容斥+dp+树状数组
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361
题意概述:
给出一个长度为N的序列A(A1,A2...AN)。如果序列A不是非降的,你必须从中删去一个数,重复这一操作,直到A非降为止。求有多少种不同的操作方案,答案模10^9+7。
N<=2000.
分析:
首先手算一下样例确定一下题意,不同的方案实际上就是删除数字的位置的不同排列。
当手算答案的时候可以发现我们可以把答案按照最终序列的长度分类。看题目的样子可以搜索但是怎么都弄不出一个子问题来构造方程,答案又可以分类,于是考虑一下容斥。
首先我们求出f(x)表示长度为x的非降子序列的数量(可以dp搞定,用个树状数组优化一下),然后将其意义令g(x)表示得到长度为x的非降子序列的合法方案数。
我们观察一下这两个东西:
g(N) = f(N)
g(N-1) = f(N-1) - N*g(N) = f(N-1) - N*f(N)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int maxn=;
const int mo=; int N,A[maxn],rank[maxn],f[maxn][maxn],g[maxn],J[maxn];
struct Binary_Index_Tree{
static const int msz=;
int c[msz],n;
Binary_Index_Tree(){
memset(c,,sizeof(c)); n=;
}
void update(int i,int v){
while(i<=n) c[i]=(c[i]+v)%mo,i+=i&(-i);
}
int query(int i){
int re=;
while(i) re=(re+c[i])%mo,i-=i&(-i);
return re;
}
}bit[maxn]; bool nega;
void _scanf(int &x)
{
x=,nega=;
char ch=getchar();
while((ch<''||ch>'')&&ch!='-') ch=getchar();
if(ch=='-') nega=,ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
if(nega) x=-x;
}
void data_in()
{
_scanf(N);
for(int i=;i<=N;i++) _scanf(A[i]);
}
void work()
{
memcpy(rank,A,sizeof(A));
sort(rank+,rank+N+);
int cnt=unique(rank+,rank+N+)-rank-;
for(int i=;i<=N;i++) bit[i].n=cnt;
for(int i=;i<=N;i++)
A[i]=lower_bound(rank+,rank+cnt+,A[i])-rank;
for(int i=;i<=N;i++){
f[i][]=;
for(int j=;j<=i;j++)
f[i][j]=(f[i][j]+bit[j-].query(A[i]))%mo;
for(int j=;j<=i;j++)
bit[j].update(A[i],f[i][j]);
}
for(int i=;i<=N;i++)
for(int j=;j<=i;j++) g[j]=(g[j]+f[i][j])%mo;
J[]=;
for(int i=;i<=N;i++) J[i]=1ll*i*J[i-]%mo;
for(int i=;i<=N;i++) g[i]=1ll*g[i]*J[N-i]%mo;
for(int i=;i<N;i++) g[i]=(g[i]-1ll*g[i+]*(i+)%mo+mo)%mo;
int ans=;
for(int i=;i<=N;i++) ans=(ans+g[i])%mo;
printf("%d\n",ans);
}
int main()
{
data_in();
work();
return ;
}
BZOJ 4361 isn 容斥+dp+树状数组的更多相关文章
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- BZOJ 1264: [AHOI2006]基因匹配Match 树状数组+DP
1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组
题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...
- 奶牛抗议 DP 树状数组
奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
- BZOJ 4361 isn | DP 树状数组
链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...
随机推荐
- 08.nextcloud搭建
由于公司用的nfs文件共享系统满足不了权限需求,测试nextcloud是否符合要求 参考博客: https://www.cnblogs.com/davidz/articles/9686716.html ...
- Delphi Math单元函数
本文转至http://blog.sina.com.cn/s/blog_976ba8a501010vvf.html 这个单元包含高性能的算术.三角.对数.统计和金融方面的计算及FPU程序函数用于补充De ...
- Linux入门——vsftpd
vsftpd Introduction vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小巧轻快,安全易用. vsftpd 的名字代表"very secure FTP ...
- django模板的变量,标签,过滤器和自定义过滤器,注释
模板的作用是计算并输出: {{ 变量}} 当模版引擎遇到点如book.title,会按照下列顺序解析: 1.字典book['title'] 2.先属性后方法,将book当作对象,查找属性title,如 ...
- 简单复习一下ArrayList的扩容原理
刚刚跟几个好朋友喝完小酒回家,简单大概复习一下ArrayList的扩容原理,由于头有点小晕,就只大概说一下扩容的原理哈: 首先ArrayList实现了List接口,继承了AbstractList,大家 ...
- HTML基础part2
表单标签form 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含textarea.sel ...
- ARP级ping命令:arping
一.工作原理 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议,是网络链路层的协议,在局域网中使用.主机发送信息时将包 ...
- Android开发——Context类的各种细节问题
0. 前言 Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了.但实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学习一下那些你所不知道的细节. ...
- 北京Uber优步司机奖励政策(1月13日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Ping隧道
1.研究原因: 校园内网的探索,校内电子图书馆资源的利用,认证校园网 2.目的: 内网服务器:在一台因防火墙等原因仅限icmp数据通过的 公网服务器 : 建立icmp 隧道链接, 并在公网服务器上进 ...