题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361

题意概述:

  给出一个长度为N的序列A(A1,A2...AN)。如果序列A不是非降的,你必须从中删去一个数,重复这一操作,直到A非降为止。求有多少种不同的操作方案,答案模10^9+7。

  N<=2000.

分析:

  首先手算一下样例确定一下题意,不同的方案实际上就是删除数字的位置的不同排列。

  当手算答案的时候可以发现我们可以把答案按照最终序列的长度分类。看题目的样子可以搜索但是怎么都弄不出一个子问题来构造方程,答案又可以分类,于是考虑一下容斥。

  首先我们求出f(x)表示长度为x的非降子序列的数量(可以dp搞定,用个树状数组优化一下),然后将其意义令g(x)表示得到长度为x的非降子序列的合法方案数。

  我们观察一下这两个东西:

  g(N) = f(N)

  g(N-1) = f(N-1) - N*g(N) = f(N-1) - N*f(N)

  g(N-2) = f(N-2) - (N-1)*g(N-1) - (N-1)*N*g(N) = f(N-2) - (N-1)*( g(N-1)+N*g(N) ) = f(N-2) - (N-1)*f(N-1)
  ......
  相信聪明机智的你一定发现了什么(滑稽),容斥的时候只要令g(i) = f(i) - (i+1)*f(i+1)就可以辣!
 
  容斥的关键还是在于分类啊
 
 
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int maxn=;
const int mo=; int N,A[maxn],rank[maxn],f[maxn][maxn],g[maxn],J[maxn];
struct Binary_Index_Tree{
static const int msz=;
int c[msz],n;
Binary_Index_Tree(){
memset(c,,sizeof(c)); n=;
}
void update(int i,int v){
while(i<=n) c[i]=(c[i]+v)%mo,i+=i&(-i);
}
int query(int i){
int re=;
while(i) re=(re+c[i])%mo,i-=i&(-i);
return re;
}
}bit[maxn]; bool nega;
void _scanf(int &x)
{
x=,nega=;
char ch=getchar();
while((ch<''||ch>'')&&ch!='-') ch=getchar();
if(ch=='-') nega=,ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
if(nega) x=-x;
}
void data_in()
{
_scanf(N);
for(int i=;i<=N;i++) _scanf(A[i]);
}
void work()
{
memcpy(rank,A,sizeof(A));
sort(rank+,rank+N+);
int cnt=unique(rank+,rank+N+)-rank-;
for(int i=;i<=N;i++) bit[i].n=cnt;
for(int i=;i<=N;i++)
A[i]=lower_bound(rank+,rank+cnt+,A[i])-rank;
for(int i=;i<=N;i++){
f[i][]=;
for(int j=;j<=i;j++)
f[i][j]=(f[i][j]+bit[j-].query(A[i]))%mo;
for(int j=;j<=i;j++)
bit[j].update(A[i],f[i][j]);
}
for(int i=;i<=N;i++)
for(int j=;j<=i;j++) g[j]=(g[j]+f[i][j])%mo;
J[]=;
for(int i=;i<=N;i++) J[i]=1ll*i*J[i-]%mo;
for(int i=;i<=N;i++) g[i]=1ll*g[i]*J[N-i]%mo;
for(int i=;i<N;i++) g[i]=(g[i]-1ll*g[i+]*(i+)%mo+mo)%mo;
int ans=;
for(int i=;i<=N;i++) ans=(ans+g[i])%mo;
printf("%d\n",ans);
}
int main()
{
data_in();
work();
return ;
}

BZOJ 4361 isn 容斥+dp+树状数组的更多相关文章

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

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

  2. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

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

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

  4. BZOJ 1264: [AHOI2006]基因匹配Match 树状数组+DP

    1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...

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

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

  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. BZOJ.4361.isn(DP 树状数组 容斥)

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

  9. BZOJ 4361 isn | DP 树状数组

    链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...

随机推荐

  1. cop2000实现补码两位乘

    程序地址 机器码 反汇编语言 指令说明 ;IN 可以使用此指令在cop2000上输入数据 00 7C4B MOV A,#4BH 模拟输入X补 02 80 MOV R0,A 放入R0 03 88F9 M ...

  2. 20181030NOIP模拟赛T2

    WYT的刷子 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的规则是: 1.与地面垂直,从 ...

  3. linux系统基础之---文件系统(基于centos7.4 1708)

  4. 04JavaScript语法

    1.JavaScript 语法 JavaScript 是一个脚本语言. 它是一个轻量级,但功能强大的编程语言 2.JavaScript 字面量 在编程语言中,一般固定值称为字面量,如 3.14. 数字 ...

  5. Redis总导航目录

    NoSQL入门和概述 NoSQL入门概述 3V + 3高 当下的NoSQL经典应用 NoSQL数据模型简介 NoSQL数据库的四大分类 在分布式数据库中CAP原理CAP+BASE Redis入门介绍 ...

  6. MySQL至TiDB复制延迟监控

    因生产环境mysql中有较多复杂sql且运行效率低,因此采用tidb作为生产环境的从库进行部分慢sql及报表的读写分离.其中MySQL至TIDB采用Syncer工具同步.关于TIDB的安装及Synce ...

  7. 「PHP」抽象工厂模式

    引言   所属:创建型模式,常用设计模式之一 参考资料: <大话设计模式>程杰   模式概述    官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相 ...

  8. Hive--关联表(join)

    在hive中,关联有4种方式: 内关联:join on 左外关联:left join on 右外关联:right join on 全外关联:full join on 另外还有一种可实现hive笛卡儿积 ...

  9. UDP server Code

    Code Example: The following programs demonstrate the use of getaddrinfo(), gai_strerror(), freeaddri ...

  10. epoll 服务端 ET模式

    windows下IOCP, linux下 epoll. epoll模型其实也是一个同步模型,ET是epoll里面的一种模式,叫 边缘触发. 个人理解,类似于 windows下的事件选择模型.代码如下: ...