热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【BZOJ4361】4361:isn(DP+树状数组+容斥)

4361:isnTimeLimit:10SecMemoryLimit:256MBSubmit:218Solved:126Description给出一个长度为n的序列A(A1,A2.

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<&#61;N<&#61;2000

Source

 

 

【分析】

  考虑倒着想。

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

  本来想保证这个的&#xff0c;但是发现放入DP里还有一个关于长度的阶乘&#xff0c;根本不行。

  然后考虑容斥。

  现在的问题是&#xff1a;倒数第一个点x&#xff0c;放入序列里面还是非降的&#xff0c;这个时候不应该计算。

  即操作结束在更之前。把这些不合法的减掉就好了。

  g[i]表示长度为i的上升序列个数

  那么贡献就是$g[i]*(n-i)!-g[i&#43;1]*(i&#43;1)*(n-i-1)!$

 

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std;
7 #define Maxn 2010
8 #define Mod 1000000007
9 // #define LL long long
10
11 int f[Maxn][Maxn],g[Maxn],fac[Maxn],c[Maxn],a[Maxn];
12
13 struct node {int x,id;}t[Maxn];
14 bool cmp(node x,node y) {return x.x<y.x;}
15
16 int mx;
17 void add(int x,int y)
18 {
19 for(int i&#61;x;i<&#61;mx;i&#43;&#61;i&(-i))
20 {
21 c[i]&#61;(c[i]&#43;y)%Mod;
22 }
23 }
24
25 int get_sum(int x)
26 {
27 int ans&#61;0;
28 for(int i&#61;x;i>&#61;1;i-&#61;i&(-i))
29 ans&#61;(ans&#43;c[i])%Mod;
30 return ans;
31 }
32
33 int main()
34 {
35 int n;
36 scanf("%d",&n);
37 for(int i&#61;1;i<&#61;n;i&#43;&#43;)
38 {
39 int x;scanf("%d",&x);
40 t[i].x&#61;x;t[i].id&#61;i;
41 }
42 sort(t&#43;1,t&#43;1&#43;n,cmp);
43 mx&#61;1;a[t[1].id]&#61;1;
44 for(int i&#61;2;i<&#61;n;i&#43;&#43;)
45 {
46 if(t[i].x!&#61;t[i-1].x) mx&#43;&#43;;
47 a[t[i].id]&#61;mx;
48 }
49 for(int i&#61;1;i<&#61;n;i&#43;&#43;) f[1][i]&#61;1;
50 for(int i&#61;2;i<&#61;n;i&#43;&#43;)
51 {
52 for(int j&#61;0;j<&#61;n;j&#43;&#43;) c[j]&#61;0;
53 for(int j&#61;1;j<&#61;n;j&#43;&#43;)
54 {
55 f[i][j]&#61;get_sum(a[j]);
56 add(a[j],f[i-1][j]);
57 }
58 }
59 for(int i&#61;1;i<&#61;n;i&#43;&#43;) for(int j&#61;1;j<&#61;n;j&#43;&#43;) g[i]&#61;(g[i]&#43;f[i][j])%Mod;
60 fac[0]&#61;1;for(int i&#61;1;i<&#61;n;i&#43;&#43;) fac[i]&#61;1LL*fac[i-1]*i%Mod;
61 int ans&#61;0;
62 ans&#61;(ans&#43;g[n]);
63 for(int i&#61;1;i)
64 {
65 ans&#61;(ans&#43;1LL*g[i]*fac[n-i]%Mod-1LL*fac[n-i-1]*g[i&#43;1]%Mod*(i&#43;1)%Mod)%Mod;
66 }
67 ans&#61;(ans&#43;Mod)%Mod;
68 printf("%d\n",ans);
69 return 0;
70 }

View Code

 

2017-04-20 17:01:57

转:https://www.cnblogs.com/Konjakmoyu/p/6739705.html



推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
额外的房间
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有