4361: isn

https://lydsy.com/JudgeOnline/problem.php?id=4361

分析:

  dp+容斥。

  首先计算出每个长度有多少种子序列是非降的。这一步可以$n^2logn$求出。dp[i][j]表示长度为i的结尾为j的方案数,用树状数组维护。

  然后考虑容斥计算答案。长度为i的序列的总共的方案数设为sum[i],加上所有的操作情况,就是$sum[i] \times (n - i) !$。但是这所有的操作情况中,可能在某个时刻非降了,就要停止。所以减去不合法的。

  长度为i的序列,在前一个时刻长度一定是i+1,经过一步多余的操作后长度变成了i,(长度i+1的时候已经合法了)。那么枚举长度i+1时的所有操作情况的序列,再减去一次就是长度为i的答案。因为枚举的是i+1所有的操作情况,可能会出现长度i+1的序列也是不合法的,此时照常减去就行,因为长度为i的序列中,也包含了长度为i+2的时候就合法了的序列(就是因为乘上了那个阶乘),多进行了两步操作后到达的现在的状态,同样包含i+3,i+4...

  $Ans=\sum_{i=1}^n(sum[i]\times (n-i)!-sum[i+1]\times (n-i-1)!\times (i+1))$

  另一种更为简单易懂的方法

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const LL mod = 1e9 + ; int a[N], disc[N], sum[N], n;
LL f[N][N], fac[N]; #define add(a,b) (a += b), a > mod ? (a -= mod) : a struct BIT{
int sum[N];
void update(int p,int v) {
for (; p <= n; p += (p & (-p))) add(sum[p], v);
}
int query(int p) {
int ans = ;
for (; p; p -= (p & (-p))) add(ans, sum[p]);
return ans;
}
}bit[N]; int main() {
n = read();
for (int i = ; i <= n; ++i) a[i] = read(), disc[i] = a[i]; int cnt = ;
sort(disc + , disc + n + );
for (int i = ; i <= n; ++i) if (disc[i] != disc[cnt]) disc[++cnt] = disc[i];
for (int i = ; i <= n; ++i) a[i] = lower_bound(disc + , disc + cnt + , a[i]) - disc; for (int i = ; i <= n; ++i) f[][i] = 1ll;
for (int i = ; i <= n; ++i) {
bit[i - ].update(a[i - ], f[i - ][i - ]);
for (int j = i; j <= n; ++j) {
f[i][j] = bit[i - ].query(a[j]);
bit[i - ].update(a[j], f[i - ][j]);
}
} LL ans = ;
fac[] = ;
for (int i = ; i <= n; ++i) fac[i] = fac[i - ] * i % mod;
for (int i = ; i <= n; ++i)
for (int j = i; j <= n; ++j) add(sum[i], f[i][j]); for (int i = ; i <= n; ++i) {
LL tmp = sum[i] * fac[n - i] % mod - sum[i + ] * fac[n - i - ] % mod * (i + ) % mod;
if (tmp < ) tmp += mod;
add(ans, tmp);
}
cout << ans; return ;
}

4361: isn的更多相关文章

  1. ●BZOJ 4361 isn

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

  2. BZOJ 4361 isn | DP 树状数组

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

  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. [BZOJ 4361]isn

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

  6. #1 // BZOJ 4361 isn

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

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

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

  8. 【BZOJ】4361: isn

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

  9. 通用js地址选择器

    用js实现通用的地址选择器,省份,城市,地区自动关联更新 点击下面查看详细代码: http://runjs.cn/code/s8sqkhcv 关键地址库代码: var addr_arr = new A ...

随机推荐

  1. TTransport 概述

    TTransport TTransport主要作用是定义了IO读写操作以及本地缓存的操作,下面来看TIOStreamTransport是如何实现的. public abstract class TTr ...

  2. Struts2通配符

    action: struts: or: 请求路径:

  3. MVC 当中 [ValidateAntiForgeryToken] 的作用

     ValidateAntiForgeryToken 防止CSRF(跨网站请求伪造) 用途:防止CSRF(跨网站请求伪造). 用法:在View->Form表单中:<%:Html.AntiFo ...

  4. 分布式架构学习-Consul集群配置

    简介 之前公司用的是Consul进行服务发现以及服务管理,自己一直以来只是用一下,但是没有具体的深入,觉得学习不可以这样,所以稍微研究了一下. 网上有很多关于Consul的介绍和对比,我这里也不献丑了 ...

  5. mac终端输入python默认打开python3

    *** 1. 终端打开.bash_profile文件 ***open ~/.bash_profile *** 2. .bash_profile文件内容 ***# Setting PATH for Py ...

  6. win10 切换网卡的bat

    @echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system3 ...

  7. Scanner(基本用法初学)

    package day01; import java.util.Scanner; public class Case05 { public static void main(String[] args ...

  8. Android环境搭建及Ionic打包(win7)

    本人刚刚接触Ionic3,初步进行打包操作,将其遇到的问题和整个流程记录下载,方便以后的巩固,也为小白们提供一个参考.因本人没有appleヽ(ー_ー)ノ,而且使用的是WIN7系统,所以暂时只提供了WI ...

  9. ionic 环境搭建

    1.安装nodejs (8.4.0) 下载地址 https://nodejs.org/zh-cn/ 2.Java jdk  版本号  jdk1.8.0_121 3.安装 cordova npm ins ...

  10. iOS日历显示农历信息

    第一次接触到日历的开发,表示需要学习的东西还有很多呢! 关于日历的开发,如果不进行相关设置的话,默认是没有农历的,需要我们进行设置. 核心Demo如下: monthArr = [NSArray arr ...