题链:

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. 《javascript设计模式与开发实践》阅读笔记(13)—— 职责链模式

    职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 书里的订单的例子 假设我们负责一个售卖手机 ...

  2. SQL SERVER 字符串按数字排序

    需求是这样的: 数据库表里面有一个字段类型是nvachar,存的值是数字和字符混合的,要实现先按数字排序,再按字母倒序. 思路: 考虑这个字段的值是否是有规律可循的,把要按数字排序的部分转换为数字,再 ...

  3. jenkins 简单实现php集成上线部署

    基于公司git版本控制,搭建jenkins实现php集成部署(没有用gitlab,测试服配置较低,gitlab卡的不要不要的了-) 一.安装jenkins相关依赖 wget -O /etc/yum.r ...

  4. Python-模块使用-Day6

    Python 之路 Day6 - 常用模块学习 本节大纲: 模块介绍time &datetime模块randomossysshutiljson & picleshelvexml处理ya ...

  5. 从微软MVP到女儿开学--2017前半年小结

    2017年转眼就到了9月,原本在年初定的计划基本泡汤了. 看书啊减肥啊出教程啊,都被因为各种事物给缠身而没有完成. 1号带女儿去报名的时候,听到老师说"家长们请到这边来集合"的时候 ...

  6. 【原生js实现一键回到顶部】

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  7. 运维-替换kibana徽标

    作为一名纯运维人员,想更改kibana的徽标. 并不能像开发一样去看源码并修改源码. 所以我们可以替换徽标. 先来一个效果图.我的版本是5.5.1. 具体的修改过程: 在kibana安装路径下面. o ...

  8. 分享java常用技术教程:dubbo、zookeeper、ActiveMq、多线程、Redis、PowerDesigner等

    游戏是自己整理的邮箱来源于网上,下面是我的有道云的分享地址: https://note.youdao.com/share/?id=c5f258fa9efd1b28b2d8f0d37e59b194&am ...

  9. jsp和servlet的区别和联系

    jsp和servlet的区别和联系:1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能 ...

  10. HTML-----<a>、<table>、<form>解析

      超链接 anchor 锚 <a href="url">内容</a> Href Hypertext reference 引用 URL(Uniform Re ...