【BZOJ4361】isn
题目
做法
\(dp_{i,j}\)表示以\(i\)结尾\(j\)长度,树状数组\(tree_{i,j}\)表长度为\(i\),以\(<=j\)结尾的个数,显然\(dp_{i,j}=\sum\limits_{k=1}^{pos[i]}tree[j-1][k]\)
从而\(O(n^2logn)\)得到每个长度不下降子序列个数
\(ans=\sum\limits_{i=1}^n(g[i]\times (n-i)!-g[i+1]\times (n-i-1)!\times (i+1))\)
怎么理解这句话呢?\(g[i]\)表长度\(i\)的个数,我们确定了长度,自然能得到这个长度的方案数,然而有些是不合法的,因为之前已经得到不下降了不能再删
那就减去\(i+1\)的个数到\(i\)的转移
My complete code
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
typedef long long LL;
const LL maxn=3000;
const LL p=1e9+7;
inline LL Read(){
LL x(0),f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
LL n,cnt,ans;
LL tree[maxn][maxn],a[maxn],b[maxn],g[maxn],dp[maxn][maxn],pos[maxn],jc[maxn];
inline LL Lowbit(LL x){
return x&(-x);
}
inline LL Query(LL len,LL x){
LL ret(0);
for(;x;x-=Lowbit(x))
ret=(ret+tree[len][x]);
return ret;
}
inline void Add(LL len,LL x,LL val){
for(;x<=n;x+=Lowbit(x))
tree[len][x]=(tree[len][x]+val)%p;
}
int main(){
n=Read();
for(LL i=1;i<=n;++i)
a[i]=b[i]=Read();
sort(b+1,b+1+n);
cnt=unique(b+1,b+1+n)-b-1;
Add(0,1,1);
for(LL i=1;i<=n;++i){
pos[i]=lower_bound(b+1,b+1+cnt,a[i])-b;
for(LL j=i;j>=1;--j){
dp[i][j]=Query(j-1,pos[i])%p;
Add(j,pos[i],dp[i][j]);
}
}
for(LL i=1;i<=n;++i)
for(LL j=1;j<=n;++j)
g[i]=(g[i]+dp[j][i])%p;
jc[1]=1;
for(LL i=2;i<=n;++i)
jc[i]=jc[i-1]*i%p;
for(LL i=1;i<=n;++i)
ans=(ans+g[i]*jc[n-i]%p-g[i+1]*jc[n-i-1]%p*(i+1)%p+p)%p;
printf("%lld\n",ans);
return 0;
}
【BZOJ4361】isn的更多相关文章
- 【BZOJ4361】isn 动态规划+树状数组+容斥
[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...
- 【BZOJ4361】isn(动态规划,容斥)
[BZOJ4361]isn(动态规划,容斥) 题面 BZOJ 题解 首先我们如果确定了一个不降序列,假设它的长度为\(i\), 那么可行的方案数为\(i*(n-i)!\),但是这样有一些非法的情况,即 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
随机推荐
- 【转】GitHub入门详细讲解
第一:请登录https://windows.github.com/ 下载您需要的安装软件,进行安装.安装后桌面有:GitHub 和 Git Shell 第二: 申请一个帐号https://github ...
- 浅谈EntityFramework框架的使用
第一步,建立一个类库,并且安装好EntityFramework框架还有CodingFirstUsingFluentApi安装包 第二步 : 第三步:配置好你的数据库连接信息,还有你需要操作的数据库,在 ...
- free bsd x修改UTC->SCT
#cp /usr/share/zoneinfo/Asia/Taipei /etc/localtime #ntpdate asia.pool.ntp.org #adjkerntz -a #date
- CentOS LVS安装配置
一般2.6.10以上内核版本都已经自带了ipvsadm,故不需要安装. Ipvs 1.25编译 ipvsadm-1.25编译不过 去掉netlink库的依赖:去掉libipvs/Makefile的CF ...
- quartus2 13.0+modelsim联合开发环境搭建(win10)
quartus2用于硬件设计代码的综合,检查是否有语法错误:modelsim用于对硬件设计代码进行仿真,观察波形是否与需求一致,需要编写xxx_tb.v才能仿真 一.quartus2安装见这篇文章ht ...
- TCP可靠传输详解
TCP提供了可靠的传输服务,这是通过下列方式提供的: 分块发送:应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给IP的信息单位称为报文段或段(segment) 定时确认重传:当TCP发出一 ...
- JWT简介json web token bear token
, "exp": 1502360328,(相差3600s) "nbf": , "jti": "R0Gd00AvOW259LGo&q ...
- UFLDL深度学习笔记 (七)拓扑稀疏编码与矩阵化
UFLDL深度学习笔记 (七)拓扑稀疏编码与矩阵化 主要思路 前面几篇所讲的都是围绕神经网络展开的,一个标志就是激活函数非线性:在前人的研究中,也存在线性激活函数的稀疏编码,该方法试图直接学习数据的特 ...
- 一站式WPF--依赖属性(DependencyProperty)
2009-10-20 11:32 by 周永恒, 22441 阅读, 24 评论, 收藏, 编辑 书接上文,前篇文章介绍了依赖属性的原理和实现了一个简单的DependencyProperty(DP), ...
- Lumen开发:lumen源码解读之初始化(5)——注册(register)与启动(boot)
版权声明:本文为博主原创文章,未经博主允许不得转载. register()是在服务容器注册服务, bootstrap/app.php /** * 注册外部服务 */ $app->register ...