Description

题库链接

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

\(1\leq n\leq 2000\)

Solution

显然对于 \(A\) 的一个长度为 \(l\) 的单调不降子序列 \(B\) 。删数而得到它的方案数为 \((n-l)!\) 。

但是这样会有不合法的情况,即长度为 \(l+1\) 的单调不降子序列被删。

记长度为 \(l\) 的单调不降子序列个数为 \(f_l\) ,那么答案为:

\[\sum_{l=1}^{n-1} f_l\cdot(n-l)!-f_{l+1}\cdot(n-l-1)!\cdot(i+1)\]

那么剩下的就是求单调不降子序列的个数了。可以用树状数组来优化这个过程,复杂度为 \(O(n^2log_2n)\) ,为整个算法的瓶颈。

Code

//It is made by Awson on 2018.3.26
#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 2000, yzh = 1e9+7; int n, a[N+5], fac[N+5], b[N+5], f[N+5];
struct bittree {
int c[N+5];
void add(int x, int val) {while (x <= n) (c[x] += val) %= yzh, x += lowbit(x); }
int count(int x) {int ans = 0; while (x) (ans += c[x]) %= yzh, x -= lowbit(x); return ans; }
}T[N+5]; void work() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
fac[0] = 1; for (int i = 1; i <= n; i++) fac[i] = 1ll*i*fac[i-1]%yzh;
sort(b+1, b+n+1);
for (int i = 1; i <= n; i++) a[i] = lower_bound(b+1, b+n+1, a[i])-b;
T[0].add(1, 1);
for (int i = 1; i <= n; i++)
for (int l = i; l >= 1; l--) {
int t = T[l-1].count(a[i]); (f[l] += t) %= yzh;
T[l].add(a[i], t);
}
int ans = 0;
for (int i = 1; i < n; i++) {
(ans += 1ll*f[i]*fac[n-i]%yzh) %= yzh;
(ans -= 1ll*f[i+1]*fac[n-i-1]%yzh*(i+1)%yzh) %= yzh;
}
printf("%d\n", (ans+yzh)%yzh);
}
int main() {work(); 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 isn

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4361 题解: 容斥,DP,树状数组 注意题意:一旦变成了非降序列,就停止操作.即对非降序列进 ...

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

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

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

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列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. 结对作业NO.2

    结对NO.2 1. 引言 1.1 项目地址 github 生成的一组好数据 1.2 项目简介 按照老师给的项目要求:"编码实现一个部门与学生的智能匹配的程序".由于数据需要自己生成 ...

  2. C语言第零次作业总结

    本次作业发现的亮点 没有发现抄袭的现象,大家都是独立且认真地完成这次的作业,希望再接再厉,继续保持 戴洁 陈欢 陈张鑫三位同学的博客写的不错,希望同学们向这三位同学学习,认真对待每次作业 本次作业的问 ...

  3. c语言——第0次作业

    1.你认为大学的学习生活.同学关系.师生应该是怎样?请一个个展开描写 大学生活:大学生活充满着挑战,首先当然必须先掌握自己所学的专业知识,然后就要学会独立,可以处理好人际关系,并且要有更强的自我约束能 ...

  4. Java ftp 上传文件和下载文件

    今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...

  5. 【编程开发】PHP---面向对象

    面向对象编程 类:在现实世界中,任何事物都有种类的概念:车 类是由特征和行为构成的. 特征:都是不动的,从出厂的时候就已经内置好了(属性) 行为:一种动的状态.(方法(函数)) 行为依赖于这些特征,而 ...

  6. 易错点---所有的字符都自带bool值

    所有的字符都自带布尔值,只有0,None,空为False,其他全部为真!!!!!!!!!!! count = 0 while count < 3 : inp_age =input('Enter ...

  7. [JCIP笔记] (二)当我们谈线程安全时,我们在谈论什么

    总听组里几个大神说起线程安全问题.本来对"线程安全"这个定义拿捏得就不是很准,更令人困惑的是,大神们用这个词指代的对象不仅抽象而且千变万化.比如,我们的架构师昨天说: " ...

  8. linux下安装配置jdk(解压版)

    在linux下登录oracle官网,下载解压版jdk    传送门 系统默认下载到"下载"目录中 创建要将该文件解压的文件夹: 其中 -p 参数代表递归创建文件夹(可以创建多级目录 ...

  9. 数据结构与算法 —— 链表linked list(03)

    继续关于linked list的算法题: 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素使得每个元素只留下一个. 案例: 给定 1->1->2,返回 1->2 给定  ...

  10. Java8新特性第2章(接口默认方法)

    在Java中一个接口一旦发布就已经被定型,除非我们能够一次性的更新所有该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现.默认方法就是为了解决这一问题的,这样接口在发布之后依然能够继续演化. ...