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更优. 那 ...
随机推荐
- DataTable扩展:转化实体ToList
直接上代码: 根据属性进行映射:DataTable转化成实体List public static class DataTableExtension { public static List<T& ...
- 批量操作QT UI中的控件
背景:在一个项目中,可能一个UI中存在大量相同的tablewidget,combobox,label等控件,每种可能有100个,此时想对它们进行同样的操作 方案:(以tablewidget为例,UI中 ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- lucene的分词器宝典
分词器概念介绍: Analyzer类(分词器)就是把一段文本中的词按某些规则取出,提供和以后查询时使用的工具类,注意在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分 ...
- ANDROID教程目录
html5 如何打包成apk,将H5封装成android应用APK文件的几种方法
- pg按日,周,月进行数据统计
pg数据库按周,月统计数据 SELECT date_trunc('WEEK', insert_time) as insertDate, SUM(data_increment) as dataTotal ...
- 【Bitset】重识
---------------------------------------------------------------------------- 一题题目: 一题题解: 这个题目哪来入门再好不 ...
- ubuntu 14.04 解决apt-get update报错
apt-get update 报如下错误: 忽略 http://cn.archive.ubuntu.com trusty-backports/multiverse Translation-zh 忽略 ...
- 24.Java中atomic包中的原子操作类总结
1. 原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchr ...
- 三十 Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中
1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号,signals.spider_closed是爬虫结束信号 # -*- coding: u ...