4361: isn
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的更多相关文章
- ●BZOJ 4361 isn
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4361 题解: 容斥,DP,树状数组 注意题意:一旦变成了非降序列,就停止操作.即对非降序列进 ...
- 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\ ...
- 通用js地址选择器
用js实现通用的地址选择器,省份,城市,地区自动关联更新 点击下面查看详细代码: http://runjs.cn/code/s8sqkhcv 关键地址库代码: var addr_arr = new A ...
随机推荐
- hook与链表操作
hook与链表的节点操作有相似之处: 链表的前后顺序相当于程序的执行流: 对链表节点的替换或插入相当于hook技术: 1.替换:用新的节点替换原来的节点: 2.前插入: 3.后插入: 修改原来的结构.
- 【[IOI2005]Riv 河流】
趁魏佬去英语演讲了,赶快%%%%%%%%%%%%%%魏佬 基本上是照着魏佬的代码写的 这其实还是一个树上背包 我们用\(dp[i][j][k]\)表示在以\(i\)为根的子树里,我们修建\(k\)个伐 ...
- POJ3384 Feng Shui
嘟嘟嘟 昨天我看到的这道题,今天终于A了. 写这道题的时间其实并不长,主要是我为这题现学了一个半平面相交(虽然是\(O(n ^ 2)\)的--) 思路说难也不难,关键是第一步的转化得想到. 首先可以肯 ...
- 解决MySQL新建用户后无法登录问题
在PHPMyAdmin里创建了一个新的用户,并且创建了密码,但是却一直无法使用这个账户登录到MySQL里. 解决过程分享给大家~ 1.以root身份登录mysql 2.删除MySQL中默认存在一个用户 ...
- 8、Dubbo-配置(3)
高可用 1.zookeeper宕机与dubbo直连 现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务. 原因: 健壮性 监控中心宕掉不影响使用,只是丢失部分采样数据 数据库宕掉后, ...
- 如何在Ubuntu中添加中文输入法
首先打开终端,输入以下命令 打开终端输入以下命令 弹出设置IBus首选项对话框,单击输入法文本框,再单击添加按钮,选中汉语中的拼音,单击添加,设置完毕. 最后单击输入法图标的选项中的首选项中的拼音模式 ...
- UVALive - 6837 Kruskal+一点性质(暴力枚举)
ICPC (Isles of Coral Park City) consist of several beautiful islands. The citizens requested constru ...
- Machine Learning In Action
The mind-road of "Machine Learning In Action". Read though the book totally by English!!
- 『C++』Temp_2019_03_14 不同类的循环引用
#include <iostream> #include <string> #include <regex> using namespace std; //提前声明 ...
- Java面试题整理1
Java基础部分 JDK和JRE有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境.JRE:Java Runtime ...