【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 ...
随机推荐
- Word基本文档字体设置
另:段落行距选择:固定值:26/28
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- scrapy框架爬取豆瓣读书(1)
1.scrapy框架 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 ...
- nightwatch API
API Nightwatch的API分为四个部分 1.Expect 在browser实例上以.expect.element开头的BDD(行为驱动测试)风格的接口,0.7及以上版本nightwatch可 ...
- 关于浮点数的json解析
近期在工作中遇到个问题 通过post请求从其他系统(好像是C#写的)获得json字符串 {"geometry":{"rings":[[[40426489.331 ...
- Redis, Memcache, Mysql差别
在使用Redis过程中,我们发现了不少Redis不同于Memcached.也不同于MySQL的特征. (本文主要讨论Redis未启用VM支持情况) 1. Schema MySQL: 需事先设计 Mem ...
- 使用OSChina代码托管管理项目(四)
本篇主要介绍使用Eclipse的Egit插件克隆远程project到本地的操作步骤 一.在Git资源库管理视图中新建一个远程资源库位置 点击红框中button进行加入 二.输入远程资源库相关信息.选择 ...
- java 原生定时执行程序(ScheduledExecutorService)
package ThreadPoolTest; import java.util.Date; import java.util.concurrent.*; public class Main { pu ...
- iOS Masonry 抗压缩 抗拉伸
约束优先级: 在Autolayout中每个约束都有一个优先级, 优先级的范围是1 ~ 1000.创建一个约束,默认的优先级是最高的1000 Content Hugging Priority: 该优先级 ...
- 从零开始学android -- dialog
先看个效果图 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <Linear ...