题链:

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的更多相关文章

  1. BZOJ 4361 isn | DP 树状数组

    链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...

  2. 【BZOJ 4361】 4361: isn (DP+树状数组+容斥)

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 218  Solved: 126 Description 给出一个长度为n的序列A( ...

  3. BZOJ 4361 isn 容斥+dp+树状数组

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...

  4. [BZOJ 4361]isn

    Description 题库链接 给出一个长度为 \(n\) 的序列 \(A\) .如果序列 \(A\) 不是非降的,你必须从中删去一个数,这一操作,直到 \(A\) 非降为止.求有多少种不同的操作方 ...

  5. #1 // BZOJ 4361 isn

    Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7.   题 ...

  6. BZOJ.4361.isn(DP 树状数组 容斥)

    题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...

  7. 【BZOJ】4361: isn

    题解 可以想一下保留一个长度为k的不降序列方案数是\(f[k] (n - k)!\) \(f[k]\)是有多少个长度为k的不降序列 我们去掉不合法的,一定是前一次操作的时候有一个长度为\(k + 1\ ...

  8. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  9. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

随机推荐

  1. Vue.js学习

    <!DOCTYPE html> <html> <head> <title>xxx</title> </head> <bod ...

  2. 201621123068 作业07-Java GUI编程

    1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 注册.事件.事件源.监听 1.2 任意编写事件处理相 ...

  3. tornado httpserver

    # coding:utf-8 import tornado.web import tornado.ioloop import tornado.httpserver # 新引入httpserver模块 ...

  4. AWS中,如果使用了ELB,出现outofservice

    平台:亚马逊AWS EC2 出现状况: 我创建了弹性平衡负载,也注册了实例,但是实例的状态一直是outofservice.为什么? 为什么会出现这个问题呢? 1:实例有问题: 2:负载平衡器创建的有问 ...

  5. nyoj 数的长度

    描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?   输入 首行输入n,表示有多少组测试数据(n<1 ...

  6. vue 保留两位小数 不能直接用toFixed(2) ?

    用vue做项目的时候多多少少都会遇到这个问题 刚开始我是用toFixed()这个方法来写的  效果是有的 但是控制台一直是红红的围绕着我 突然想到 vue和jquery混搭 的 问题 于是乎 看了一下 ...

  7. python之路--day15--常用模块之logging模块

    常用模块 1 logging模块 日志级别:Noset (不设置) Debug---(调试信息)----也可用10表示 Info--(消息信息)----也可用20表示 Warning---(警告信息) ...

  8. thinkphp框架调用类不存在的方法

    thinkphp框架调用类不存在的方法调用类不存在的方法,不会报错,但是也不会执行,这是根据tp框架里面的一个魔术方法,框架里面一共才十几个魔术方法

  9. SpringBoot项目如何进行打包部署

    springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为spring ...

  10. javascript 中的类型

    javascript 中的类型 js 是一门弱语言,各式各样的错误多种多样,特别是确定返回值有问题的时候,你会用什么来进行表示错误? 我一般有三个选择: null '' error {} 第一个选择 ...