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. ...
随机推荐
- oracle入门(一)
### 一.体系结构 1. 数据库 : 只有一个数据库 2. 实例 : 后台运行的一个进程 3. 表空间: 逻辑存储单位 4. 数据文件: 物理存储单位 5. 用户:面向用户管理,由用户来管理表空间, ...
- 用 crontab 实现开机自动运行脚本
开发「bufpay.com 个人即时到账收款平台」的时候,订单状态和支付二维码的状态如果过期了要实时修改状态,最大效率利用支付二维码. 过期脚本需要开机启动,并且 deamon 运行,有很多办法可以开 ...
- git获取步骤
$ git init $ git config --global user.name "[name]" $ git config --global user.email [emai ...
- 针对jquery的ajax中的参数理解
1. url 发送请求的地址.为空表示当前页. $.ajax({ type: "post", data: studentInfo, contentType: "appli ...
- es6 Proxy对象详解
Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改.这个词的原理为代理,在这里可以表示 ...
- Robots协议(摘)
robots协议 Robots协议(也称为爬虫协议.机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓 ...
- 关于PHPExcel 导出下载表格,调试器响应乱码
PHPExcel导出表格是日常程序开发很常见的一功能,有些小伙伴千辛万苦把代码写好之后,运行一下结果发现浏览器没反应,表格下载不了或者表格乱码!!!像这种情况有三种解决方法: 1.在header 之前 ...
- FMX有一套自己的消息处理机制。类似这样:
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Var ...
- IDELPHI是一个MIS系统初学者的乐园空间
DELPHI的长处之一是MIS系统,此空间介绍了MIS中种种问题,及使用DELPHI XE做的办法. 为什么选择DELPHI? DELPHI是开发效率很高的一个工具,但也许很多人都喜欢选择微软.NET ...
- 嵌入式LInux之C语言提升篇---Skr Skr Up Up
嵌入式C语言提升 致敬:每一个奋斗的人! Up Up UpC语言常见编译错误1.预处理错误 -E 1-1 找不到源文件错误 自己定义头文件 使用 “xxx.h” 搜索的目录 ./ ...