热门标签 | 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



推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
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社区 版权所有