BZOJ4361 isn(动态规划+树状数组+容斥原理)
首先dp出长度为i的不下降子序列个数,显然这可以树状数组做到O(n2logn)。
考虑最后剩下的序列是什么,如果不管是否合法只是将序列删至只剩i个数,那么方案数显然是f[i]*(n-i)!。如果不合法,说明这个序列是由一个长度为i+1的非降序列删除一个数得来的,所以将其减去f[i+1]*(i+1)*(n-i-1)。这里的斥显然不会有重复。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 2010
#define P 1000000007
int n,a[N],b[N],f[N],tree[N][N],ans[N],fac[N],t,tot;
inline int inc(int &x,int y){x+=y;if (x>=P) x-=P;}
void add(int x,int k,int p){while (k<=t) inc(tree[x][k],p),k+=k&-k;}
int query(int x,int k){int s=;while (k) inc(s,tree[x][k]),k-=k&-k;return s;}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4361.in","r",stdin);
freopen("bzoj4361.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) b[i]=a[i]=read();
sort(b+,b+n+);
t=unique(b+,b+n+)-b-;
for (int i=;i<=n;i++) a[i]=lower_bound(b+,b+t+,a[i])-b;
f[]=;add(,,);
for (int i=;i<=n;i++)
{
for (int j=;j<=i;j++)
inc(ans[j],f[j]=query(j-,a[i]));
for (int j=;j<=i;j++)
add(j,a[i],f[j]);
}
fac[]=;
for (int i=;i<=n;i++) fac[i]=1ll*i*fac[i-]%P;
for (int i=;i<=n;i++)
inc(tot,(1ll*ans[i]*fac[n-i]%P-1ll*ans[i+]*fac[n-i-]%P*(i+)%P+P)%P);
cout<<tot;
return ;
}
BZOJ4361 isn(动态规划+树状数组+容斥原理)的更多相关文章
- 【bzoj1109】[POI2007]堆积木Klo 动态规划+树状数组
题目描述 Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置 ...
- 【BZOJ4361】isn 动态规划+树状数组+容斥
[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...
- bzoj4361 isn(树状数组优化dp+容斥)
4361: isn Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 938 Solved: 485[Submit][Status][Discuss] ...
- BZOJ4361 isn 【树状数组优化DP】*
BZOJ4361 isn Description 给出一个长度为n的序列A(A1,A2-AN).如果序列A不是非降的,你必须从中删去一个数,这一操作,直到A非降为止.求有多少种不同的操作方案,答案模1 ...
- 2015 CCPC-C-The Battle of Chibi (UESTC 1217)(动态规划+树状数组)
赛后当天学长就说了树状数组,结果在一个星期后赖床时才有了一点点思路…… 因为无法提交,不确定是否正确..嗯..有错希望指出,谢谢... 嗯..已经A了..提交地址http://acm.uestc.ed ...
- bzoj4361 isn (dp+树状数组+容斥)
我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn) ...
- BZOJ4990 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4990 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...
- BZOJ4993 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4993 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...
- BZOJ1264 [AHOI2006]基因匹配Match 动态规划 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1264 题意概括 给出两个长度为5*n的序列,每个序列中,有1~n各5个. 求其最长公共子序列长度. ...
随机推荐
- (转)Windows安装和使用zookeeper
(转)原地址https://www.cnblogs.com/shanyou/p/3221990.html 之前整理过一篇文章<zookeeper 分布式锁服务>,本文介绍的 Zookeep ...
- LINUX 启动图形界面和查看运行级别
runlevel 查看当前运行级别 cat /etc/inittab 可以查看7个运行级别 init 6 == reboot == shuttdown -r now 都是表示重启的命令 ...
- 服务命令只支持基本的LSB操作(启动、停止、重新启动、尝试重启、重新加载、强制重新加载、状态)。对于其他操作,请尝试使用systemctl。
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, forc ...
- python与mysql的连接过程
1.cmd---pip3 install PyMySQL2.>>>import pymysql3.mysql>create database bookdb character ...
- 002---Python基本数据类型--字符串
字符串 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1p ...
- requests模块基础
requests模块 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bor ...
- Linux(CentOS)安装Node.JS
源码安装 比使用yum安装灵活 1.创建目录 cd /opt mkdir program cd program 2.下载安装包 wget https://nodejs.org/dist/v8.12.0 ...
- Linux 之vi与vim
vi 三种模式: 『一般模式』: 光标 『编辑模式』:i,o,a,r 『指令列命令模式』「:/ ?」 例子: 1. 请在/tmp 这个目录下建立一个名为vitest 的目录: 2. 将/etc/man ...
- intellij idea之git执行打标签(tag)和删除标签
intellij idea 版本为2017.2.6 进入Version Control-->log 1.在之前版本中,右键,新建标签 2.输入标签名称,建议输入版本号的方式 3.push标签 由 ...
- 【转】在Ubuntu 16.10 Server 上部署 Moodle
第一步 安装 Ubuntu 16.10 Server LTS Moodle 的官方文档肯定了Ubuntu Server LTS 是适合运维Moodle平台的. 1.使用纯代码交互的服务器Ubuntu更 ...