4361: isn

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 218  Solved: 126

Description

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

Input

第一行一个整数n。
接下来一行n个整数,描述A。

Output

一行一个整数,描述答案。

Sample Input

4
1 7 5 3

Sample Output

18

HINT

1<=N<=2000

Source

【分析】

  考虑倒着想。

  你倒数第一步做之前还不是非降,做完之后就非降了,说明如果有一个上升序列,你加倒数第一个点时候不是上升序列了,前面的操作就可以任意了。

  本来想保证这个的,但是发现放入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+树状数组+容斥)的更多相关文章

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

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

  2. 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) ...

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

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

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

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

  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 树状数组

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

  9. BZOJ 4361 isn 容斥+dp+树状数组

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4361 题意概述: 给出一个长度为N的序列A(A1,A2...AN).如果序列A不是非降的 ...

随机推荐

  1. ⑦ 设计模式的艺术-13.代理(Proxy)模式

    为什么需要代理模式 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口. 开闭原则,增加 ...

  2. win10本地搭建php运行环境

    一.下载搭建环境所需软件,安装顺序也要按照列表顺序安装 1.Vc2015(根据需要安装Vc2012或者Vc2015) Vc2015:https://www.microsoft.com/zh-CN/do ...

  3. Spring Boot工程结构推荐

    工程结构(最佳实践) Spring Boot框架本身并没有对工程结构有特别的要求,但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑,尤其是Spring包扫描机制的存在,如果您使用最佳实践的工程 ...

  4. [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)

    [CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...

  5. 2017ACM暑期多校联合训练 - Team 6 1003 HDU 6098 Inversion (模拟)

    题目链接 Problem Description Give an array A, the index starts from 1. Now we want to know Bi=maxi∤jAj , ...

  6. U盘出现大量乱码文件,并且不能彻底删除

    问题如图所示: 问题出现原因:不正常的插拔等情况造成的,导致U盘的文件分配表错乱了 解决方法:参考http://bbs.cfanclub.net/thread-405004-1-1.html 运行ch ...

  7. 模型稳定度指标PSI与IV

    由于模型是以特定时期的样本所开发的,此模型是否适用于开发样本之外的族群,必须经过稳定性测试才能得知.稳定度指标(population stability index ,PSI)可衡量测试样本及模型开发 ...

  8. 【IDEA】IDEA设置新建文件的模板

    今天在IDEA中新建JS文件的时候想着也像WebStorm一样可以显示作者和时间,所以就研究了下在IDEA中修改文件创建时的模板. 点击settings找到File and Code Template ...

  9. skb_reserve(skb,2)中的2的意义

    skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存区中插入协议首部或者在某个边界上对齐.它并没有把数据移出或移入数据缓存区,而只是简单地更新了数 ...

  10. Java线上应用故障排查之一:高CPU占用【转】

    近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 方法一: 转载:http://www.linuxhot.com/java-cpu-used-high.htm ...