【BZOJ 4361】 4361: isn (DP+树状数组+容斥)
4361: isn
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 218 Solved: 126Description
给出一个长度为n的序列A(A1,A2...AN)。如果序列A不是非降的,你必须从中删去一个数,这一操作,直到A非降为止。求有多少种不同的操作方案,答案模10^9+7。Input
第一行一个整数n。接下来一行n个整数,描述A。Output
一行一个整数,描述答案。
Sample Input
4
1 7 5 3Sample Output
18HINT
1<=N<=2000Source
【分析】
考虑倒着想。
你倒数第一步做之前还不是非降,做完之后就非降了,说明如果有一个上升序列,你加倒数第一个点时候不是上升序列了,前面的操作就可以任意了。
本来想保证这个的,但是发现放入DP里还有一个关于长度的阶乘,根本不行。
然后考虑容斥。
现在的问题是:倒数第一个点x,放入序列里面还是非降的,这个时候不应该计算。
即操作结束在更之前。把这些不合法的减掉就好了。
g[i]表示长度为i的上升序列个数
那么贡献就是$g[i]*(n-i)!-g[i+1]*(i+1)*(n-i-1)!$
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 2010
#define Mod 1000000007
// #define LL long long int f[Maxn][Maxn],g[Maxn],fac[Maxn],c[Maxn],a[Maxn]; struct node {int x,id;}t[Maxn];
bool cmp(node x,node y) {return x.x<y.x;} int mx;
void add(int x,int y)
{
for(int i=x;i<=mx;i+=i&(-i))
{
c[i]=(c[i]+y)%Mod;
}
} int get_sum(int x)
{
int ans=;
for(int i=x;i>=;i-=i&(-i))
ans=(ans+c[i])%Mod;
return ans;
} int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x;scanf("%d",&x);
t[i].x=x;t[i].id=i;
}
sort(t+,t++n,cmp);
mx=;a[t[].id]=;
for(int i=;i<=n;i++)
{
if(t[i].x!=t[i-].x) mx++;
a[t[i].id]=mx;
}
for(int i=;i<=n;i++) f[][i]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++) c[j]=;
for(int j=;j<=n;j++)
{
f[i][j]=get_sum(a[j]);
add(a[j],f[i-][j]);
}
}
for(int i=;i<=n;i++) for(int j=;j<=n;j++) g[i]=(g[i]+f[i][j])%Mod;
fac[]=;for(int i=;i<=n;i++) fac[i]=1LL*fac[i-]*i%Mod;
int ans=;
ans=(ans+g[n]);
for(int i=;i<n;i++)
{
ans=(ans+1LL*g[i]*fac[n-i]%Mod-1LL*fac[n-i-]*g[i+]%Mod*(i+)%Mod)%Mod;
}
ans=(ans+Mod)%Mod;
printf("%d\n",ans);
return ;
}
2017-04-20 17:01:57
【BZOJ 4361】 4361: isn (DP+树状数组+容斥)的更多相关文章
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
- bzoj4361 isn (dp+树状数组+容斥)
我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn) ...
- 【BZOJ4361】isn 动态规划+树状数组+容斥
[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- 【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 ...
- 奶牛抗议 DP 树状数组
奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...
- BZOJ 4361 isn | DP 树状数组
链接 BZOJ 4361 题面 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案,答案模10^9+7. ...
- BZOJ 4361 isn 容斥+dp+树状数组
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...
随机推荐
- 每个Web开发者都需要具备的9个软技能
对于一份工作,你可能专注于修炼自己的内功,会在不自觉中忽视软技能.硬技能决定你是否能得到工作,而软技能能够表明你是否适合这份工作和适应工作环境等.所有的公司都有属于自己的文化,并努力将这些文化传承下去 ...
- 【BZOJ】2599: [IOI2011]Race 点分治
[题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...
- PHP非常好用的分页类
分页类: <?php /* * ********************************************* * @类名: page * @参数: $myde_total - 总记 ...
- redis集群离线安装环境搭建过程
本文是继上次redis集群重新整理的离线搭建环境,关于前期的redis集群准备工作参考我另一篇博客: http://www.cnblogs.com/qlqwjy/p/8566573.html 由于集群 ...
- 多线程中的超时, 如Socket超时
; ,,, ->$port { print "-->$port\r"; #say "\r"; await Promise.anyof( Promis ...
- Workqueue机制的实现
Workqueue机制中定义了两个重要的数据结构,分析如下: cpu_workqueue_struct结构.该结构将CPU和内核线程进行了绑定.在创建workqueue的过程中,Linux根据当前系统 ...
- Linux中切换用户变成-bash4.1-$的解决方法
原因是root在/root下面的几个配置文件丢失,将/etc/skel/目录下的三个文件拷贝到用户家目录即可 cp /etc/skel/.bashrc /root/ cp /etc/skel/.bas ...
- mac下 mysql / nginx 问题总汇
"ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)&q ...
- shell中的变量与eval(转)
原文链接:http://www.361way.com/shell-eval-variable/4957.html shell 中经常会用到变量的嵌套的情况.比如,单个或多个变量的值作为变量名,再对该变 ...
- java关键字(详解)
目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...