BZOJ4361 isn 【树状数组优化DP】*
BZOJ4361 isn
Description
给出一个长度为n的序列A(A1,A2…AN)。如果序列A不是非降的,你必须从中删去一个数,这一操作,直到A非降为止。求有多少种不同的操作方案,答案模10^9+7。
Input
第一行一个整数n。
接下来一行n个整数,描述A。
Output
一行一个整数,描述答案。
Sample Input
4
1 7 5 3
Sample Output
18
HINT
1<=N<=2000
我们可以设dp[i][j]" role="presentation">dp[i][j]dp[i][j]是前i个数,选出包含i的j个数的方案数,然后我们发现转移其实很显然,dp[i][j]=∑dp[k][j−1]" role="presentation">dp[i][j]=∑dp[k][j−1]dp[i][j]=∑dp[k][j−1],然后这玩意可以树状数组维护一下就优化下来了
然后贼优秀
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3f
#define N 2010
#define yyf 1000000007
LL n,newn,a[N],b[N],J[N];
LL t[N][N],dp[N];
void add(LL &a,LL b){a=(a+b)%yyf;}
void add(LL k,LL pos,LL vl){for(;pos<=newn;pos+=pos&(-pos))add(t[k][pos],vl);}
LL query(LL k,LL pos){LL res=0;for(;pos;pos-=pos&(-pos))add(res,t[k][pos]);return res;}
int main(){
scanf("%lld",&n);
J[0]=1;for(LL i=1;i<=n;i++)J[i]=1ll*i*J[i-1]%yyf;
for(LL i=1;i<=n;i++)scanf("%lld",&a[i]),b[i]=a[i];
sort(b+1,b+n+1);
newn=unique(b+1,b+n+1)-b-1;
for(LL i=1;i<=n;i++)a[i]=lower_bound(b+1,b+newn+1,a[i])-b;
add(0,1,1);
for(LL i=1;i<=n;i++)
for(LL j=i;j>=1;j--){
LL tmp=query(j-1,a[i]);
add(dp[j],tmp);
add(j,a[i],tmp);
}
LL ans=0;
for(LL i=1;i<=n;i++){
add(ans,J[n-i]*dp[i]%yyf);
if(i!=n)add(ans,yyf-J[n-i-1]*(i+1)%yyf*dp[i+1]%yyf);
}
printf("%lld\n", ans);
return 0;
}
BZOJ4361 isn 【树状数组优化DP】*的更多相关文章
- HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...
- Codeforces 946G Almost Increasing Array (树状数组优化DP)
题目链接 Educational Codeforces Round 39 Problem G 题意 给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...
- LUOGU P2344 奶牛抗议 (树状数组优化dp)
传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...
- 【题解】Music Festival(树状数组优化dp)
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
- 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
[题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...
- BZOJ4361 isn 树状数组、DP、容斥
传送门 不考虑成为非降序列后停止的限制,那么答案显然是\(\sum\limits_{i=1}^N cnt_i \times (N-i)!\),其中\(cnt_i\)表示长度为\(i\)的非降序列数量 ...
- Codeforces 909C Python Indentation:树状数组优化dp
题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...
- BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
- BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)
分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...
随机推荐
- 分析java进程假死状况
摘自: http://www.myexception.cn/internet/2044496.html 分析java进程假死情况 1 引言 1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常 ...
- Entity Framework 中 Schema是什么
在使用Entity Framework时,会注意到下面这句: protected override void OnModelCreating(DbModelBuilder modelBuilder) ...
- Oracle函数中文转拼音(首字母)
CREATE OR REPLACE FUNCTION FUN_GET_PYCODE(p_str IN VARCHAR2, p_flag NUMBER DEFAULT NULL) RETURN VARC ...
- php http post发送失败的问题
//params 是json对象private function HttpPost($url, $params){$data = http_build_query($params); //写 ...
- Git的基础学习
https://www.w3cschool.cn/git/git-install-setup.html 一.安装 Git官网下载,安装,操作步骤可以百度 二.用户信息配置 配置个人用户名称和邮箱地址: ...
- oracle的批量插入sql
insert into persons (id_p, lastname , firstName, city ) values (200,'haha' , 'deng' , 'shenzhen'), ( ...
- CentOS开端口问题
关闭SELINUX ##查看SELINUX状态 /usr/sbin/sestatus -v getenforce #修改config配置文件,重启后即可 vi /etc/selinux/config ...
- 设计模式--建造者模式C++实现
建造者模式C++实现 1定义 将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创造不同的表示 注:在模板方法中,实现了父类调用子类方法的功能,且,通过钩子实现了方法的选择性调用.但是其中整体 ...
- cowsay
# apt install cowsay sl cmatrix $ cowsay "hello~" $ find /usr/share/cowsay/cows -iname &qu ...
- 第六天 文件的基本管理和xfs文进系统备份恢复
1.1 Linux系统目录结构,相对路径/绝对路径 1.1.1 Linux系统目录结构 在linux系统中一切都是文件 / 根目录,一切的起点,就像是一个树杈一样,他是所有叉的根 /bin 在单用户模 ...