我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn)$求出来

然后我们让g[i]是长度为i的不降子序列的个数,答案就是$\sum{g[i]*(N-i)!-g[i+1]*(N-i-1)!*(i+1)}$

解释一下,因为他求的是不同的操作个数,所以我们给g[i]乘个(N-i)!,表示删的顺序;但其实我们有可能删的时候已经删出来了一个不降子序列。类似地,删多的的不同操作数是g[i+1]*(N-i-1)!,但我们还要从中再挑一个删下去,才和我们现在做的吻合,所以要乘个(i+1)

(数据中貌似有0,然后我的zz离散化写法就华丽丽地T了)

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define ll long long
using namespace std;
const int maxn=,mod=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,M,f[maxn][maxn],num[maxn];
pa A[maxn];
int tr[maxn],fac[maxn]; inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y){
for(;x<=M;x+=lowbit(x)) tr[x]=(tr[x]+y)%mod;
}
inline int query(int x){
int re=;for(;x;x-=lowbit(x)) re=(re+tr[x])%mod;return re;
} int main(){
int i,j,k;
N=rd();fac[]=;
for(i=;i<=N;i++){
A[i]=make_pair(rd(),i);
fac[i]=(1LL*fac[i-]*i)%mod;
}sort(A+,A+N+);
for(i=,j=;i<=N;i++){
if(A[i].first!=A[i-].first||i==) j++;
num[A[i].second]=j;
}M=j;
for(i=;i<=N;i++) f[][i]=;
f[][]=N;
for(i=;i<=N;i++){
memset(tr,,sizeof(tr));
f[i][]=;
for(j=i;j<=N;j++){
add(num[j-],f[i-][j-]);
f[i][j]=query(num[j]);
f[i][]=(f[i][]+f[i][j])%mod;
}
}int ans=;
for(i=;i<=N;i++){
if(!f[i][]) break;
ans=((0LL+ans+(1LL*f[i][]*fac[N-i]%mod)-(1LL*f[i+][]*fac[N-i-]%mod)*(i+)%mod)%mod+mod)%mod;
}printf("%d\n",(ans+mod)%mod);
return ;
}

bzoj4361 isn (dp+树状数组+容斥)的更多相关文章

  1. BZOJ.4361.isn(DP 树状数组 容斥)

    题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...

  2. 【BZOJ 4361】 4361: isn (DP+树状数组+容斥)

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 218  Solved: 126 Description 给出一个长度为n的序列A( ...

  3. 【BZOJ4361】isn 动态规划+树状数组+容斥

    [BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...

  4. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  5. bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 793  Solved: 503[Submit][S ...

  6. 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...

  7. 奶牛抗议 DP 树状数组

    奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...

  8. bzoj4361 isn(树状数组优化dp+容斥)

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 938  Solved: 485[Submit][Status][Discuss] ...

  9. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

随机推荐

  1. Scala学习(四)练习

    映射和元组&练习 1. 设置一个映射,其中包含你想要的一些装备,以及它们的价格.然后构建另一个映射,采用同一组键,但在价格上打9折 映射代码如下: object HelloScala{ def ...

  2. vsftpd虚拟账户配置

    1. 概述 FTP是文件传输协议,在内外网的文件传输中使用广泛. 本篇博客主要介绍FTP服务器的部署和测试. 2. 软件环境部署 查看系统是否安装FTP软件(vsftpd),执行命令:rpm -qa ...

  3. C#_XML与Object转换

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  4. CentOS6.9下升级默认的OpenSSH操作记录(升级到OpenSSH_7.6p1)

    近期对IDC机房服务器做了一次安全漏洞扫描,漏扫结果显示服务器的OpenSSH版本太低(CentOS6默认是OpenSSH_5.3p1),存在漏洞隐患,安全部门建议升级到OpenSSH_7.6p1.升 ...

  5. Jmeter(GUI模式)教程

    前些天,领导让我做接口的压力测试.What??我从未接触过这方面,什么都不知道,一脸蒙.于是我从学习jmeter开始入手. 现在记录下来jmeter的使用步骤,希望能对大家有所帮助. 一.安装Jmet ...

  6. Segment Occurrences(string find函数)

    Description You are given two strings s and t, both consisting only of lowercase Latin letters.The s ...

  7. Spring配置常识

    (1)数据源配置 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" ...

  8. Java对象及对象引用变量

    Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对 ...

  9. redux的源码解析

    一. redux出现的动机 1. Javascript 需要管理比任何时候都要多的state2. state 在什么时候,由于什么原因,如何变化已然不受控制.3. 来自前端开发领域的新需求4. 我们总 ...

  10. MySQL乐观锁在分布式场景下的实践

    背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...