●BZOJ 4361 isn
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=4361
题解:
容斥,DP,树状数组
注意题意:一旦变成了非降序列,就停止操作。即对非降序列进行操作是非法的。
首先求出 dp[i][j]:表示以第i个数作为结尾且长度为j的不降序列的种类数
转移显然 : dp[i][j]+=dp[k][j-1] k<i且a[k]<=a[j],复杂度 O(N^3)
可以用 树状数组优化到 O(N^2*log2N),(要开 N个树状数组)
然后得到 g[j]+=dp[i][j]:表示长度为 j的不降序列的种类数。
在令 w[i]=g[i]*(N-i)!含义是留下的i个数,组成非降序列,那 N-i个数有(N-i)!种方法把它们拿走。
那么 答案就是 w[1] + w[2] + w[3] +.....
完了么?当然没有,细细一想,w[ ]好像有问题:
不是说一旦变成了非降序列,就要停止操作么,
所以 w[i]完全可能会存在某个方案还没操作完就已经非降了,那么要减去这些方案。
怎么减呢?
不难发现,w[i+1]里包含了两类方案,
一类是取了N-(i+1)个数后恰好变成非降序列,这类是合法的操作
另一类是还没有取到第N-(i+1)个数就已经非降了,那么这类操作就是非法的
同时对于 w[i]来说,其中包含的非法方案就是上面两类操作的方案数*(i+1), 即w[i+1]*(i+1)
所以减去就好了 : w[i]-=w[i+1]*(i+1)
最后的答案才是 w[1] + w[2] + w[3] +.....
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 2050
#define _ %mod
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
const int mod=1000000007;
struct BIT{
int val[MAXN][MAXN],N;
void Init(int n){
N=n;
memset(val,0,sizeof(val));
}
int Lowbit(int x){
return x&-x;
}
void Modify(int id,int p,int x){
for(int i=p;i<=N;i+=Lowbit(i))
val[id][i]=(1ll*val[id][i]+x)_;
}
int Query(int id,int p){
int ans=0;
for(int i=p;i;i-=Lowbit(i))
ans=(1ll*ans+val[id][i])_;
return ans;
}
}t;
int dp[MAXN][MAXN],g[MAXN],a[MAXN],fac[MAXN]; //dp[i][j] 以i结尾,序列长度为 j的方案
int N,ANS;
int main()
{
static int tmp[MAXN],M;
scanf("%d",&N); t.Init(N); fac[0]=1;
for(int i=1;i<=N;i++) fac[i]=(1ll*fac[i-1]*i)_;
for(int i=1;i<=N;i++) scanf("%d",&a[i]),tmp[i]=a[i];
sort(tmp+1,tmp+N+1); M=unique(tmp+1,tmp+N+1)-tmp-1;
for(int i=1;i<=N;i++) a[i]=lower_bound(tmp+1,tmp+M+1,a[i])-tmp;
for(int i=1;i<=N;i++){
for(int j=i;j>=2;j--){
dp[i][j]=t.Query(j-1,a[i]);
t.Modify(j,a[i],dp[i][j]);
}
dp[i][1]=1; t.Modify(1,a[i],dp[i][1]);
}
for(int j=1;j<=N;j++){
for(int i=1;i<=N;i++)
g[j]=(1ll*g[j]+dp[i][j])_;
g[j]=(1ll*g[j]*fac[N-j])_;
}
for(int i=1;i<=N;i++)
g[i]=(1ll*g[i]-(1ll*g[i+1]*(i+1))_+mod)_,ANS=(1ll*ANS+g[i])_;
printf("%d",ANS);
return 0;
}
●BZOJ 4361 isn的更多相关文章
- BZOJ 4361 isn | DP 树状数组
链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...
- 【BZOJ 4361】 4361: isn (DP+树状数组+容斥)
4361: isn Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 218 Solved: 126 Description 给出一个长度为n的序列A( ...
- BZOJ 4361 isn 容斥+dp+树状数组
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...
- [BZOJ 4361]isn
Description 题库链接 给出一个长度为 \(n\) 的序列 \(A\) .如果序列 \(A\) 不是非降的,你必须从中删去一个数,这一操作,直到 \(A\) 非降为止.求有多少种不同的操作方 ...
- #1 // BZOJ 4361 isn
Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. 题 ...
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
- 【BZOJ】4361: isn
题解 可以想一下保留一个长度为k的不降序列方案数是\(f[k] (n - k)!\) \(f[k]\)是有多少个长度为k的不降序列 我们去掉不合法的,一定是前一次操作的时候有一个长度为\(k + 1\ ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
随机推荐
- 团队作业4——第一次项目冲刺(Alpha版本) Day 1
小队@JMUZJB-集美震惊部 一.Daily Scrum Meeting照片 二.Burndown Chart 燃尽图 三.项目进展 1.界面 屏幕开发中,原型设计完毕. 2.服务器 服务器由学校提 ...
- 关于mule中Spring使用中的一个问题
在mule中连接数据库时,大家通常喜欢使用spring的数据库连接以及bean的配置,但是在使用时会出现一些问题,即bean无法找到,这些,就是需要把bean的id属性改成name属性:可能是因为mu ...
- JAVA_SE基础——7.常量&变量
上一篇,我讲了标识符&关键字 这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...
- ASP.NET Web API编程——路由
路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生 ...
- c# 几种深拷贝方式的比较
public static class Tools { //利用 BinaryFormatter 实现深拷贝 public static T DeepCopyByBinary<T>(thi ...
- Python内置函数(61)——eval
英文文档: eval(expression, globals=None, locals=None) The arguments are a string and optional globals an ...
- OpenID Connect + OAuth2.0
一.问题的提出 现代应用程序或多或少都是如下这样的架构: 在这种情况下,前端.中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能.为了解决这样的问题 ...
- Java Class文件格式详解
magic[4字节] 魔数,用来判断是否可以被虚拟机使用.固定值为0xCAFEBABE(咖啡宝贝)minor_version[2字节] 次版本号major_version[2字节] 主版本号,低版本的 ...
- Hadoop API:遍历文件分区目录,并根据目录下的数据进行并行提交spark任务
hadoop api提供了一些遍历文件的api,通过该api可以实现遍历文件目录: import java.io.FileNotFoundException; import java.io.IOExc ...
- 如何用webgl(three.js)搭建一个3D库房-第二课
闲话少叙,我们接着第一课继续讲(http://www.cnblogs.com/yeyunfei/p/7899613.html),很久没有做技术分享了.很多人问第二课有没有,我也是抽空写一下第二课. 第 ...