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更优. 那 ...
随机推荐
- python 使用set对list去重,并保持list原来顺序
list_one=re.findall(r"^\s{0}[A-Za-z]*\b", txt,re.M) #匹配一级目录 addr_to = list(set(list_one))a ...
- java HTTP代码示例
//测试环境发送用例 @Test public void testSendForTest() { String url = "http://172.16.30.108:8138/ap ...
- C++学习——C++复合类型
1.引用 引用是为某一个变量起了另一个名字,定义方式为type &rval = val; 引用类型必须与引用的变量类型完全一致,引用后,rval和val将会被视为一个变量,只不过有两种调用方式 ...
- C#忽略decimal多余的0
decimal test=1.2000:test.ToString("0.####");
- CSP(Content Security Policy) 入门教程
参考: http://www.ruanyifeng.com/blog/2016/09/csp.html https://developer.mozilla.org/en-US/docs/Web/HTT ...
- 理解OpenID和OAuth的区别
在项目开发中,我们经常说授权认证,经常把他们放到一起去描述,那两者在本质上是有区别的,OpenID和OAuth就是我们说的认证和授权. OpenID:Authentication 认证 OAuth : ...
- CSS布局框架 960GS
1.960GS 特点 小巧简单,功能单一(仅仅做排版的工作,其他东西靠自己.)(三个文件:reset.css,960.css,font.css) 界面宽960px,适合目前主流1/2以上显示器都满屏宽 ...
- 重新学习MySQL数据库10:MySQL里的那些日志们
重新学习MySQL数据库10:MySQL里的那些日志们 同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志, ...
- tkinter模块常用参数
tkinter模块常用参数 1.使用tkinter.Tk() 生成主窗口(root=tkinter.Tk()):root.title('标题名') 修改框体的名字,也可在创建时使用class ...
- Vue项目上线后刷新报错404问题(apache,nginx,tomcat)
转自:https://www.cnblogs.com/sxshaolong/p/10219527.html 很简单,需要 服务器端 加个配置文件,然后 重启服务就好了,记住一定要 重启服务,否则无效!