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



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
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社区 版权所有