小明复仇记:连号区间数(模拟)

网友投稿 568 2022-11-05

小明复仇记:连号区间数(模拟)

小明复仇记:连号区间数(模拟)

小明这些天一直在思考这样一个奇怪而有趣的问题:

在 1∼N 的某个排列中有多少个连号区间呢?

这里所说的连号区间的定义是:

如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。

当 N 很小的时候,小明可以很快地算出答案,但是当 N 变大的时候,问题就不是那么简单了,现在小明需要你的帮助。

输入格式 第一行是一个正整数 N,表示排列的规模。

第二行是 N 个不同的数字 Pi,表示这 N 个数字的某一排列。

输出格式 输出一个整数,表示不同连号区间的数目。

数据范围 1≤N≤10000, 1≤Pi≤N 输入样例1: 4 3 2 4 1 输出样例1: 7 输入样例2: 5 3 4 2 5 1 输出样例2: 9 样例解释 第一个用例中,有 7 个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4] 第二个用例中,有 9 个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[3,3],[4,4],[5,5]

# 核心思想:连续排列[l,r],如果是连号区间,那么该区间排序后,max-min = r - ln = int(input())lis = [int(i) for i in input().split()]res = 0for i in range(n):# 左区间 min,max = lis[i],lis[i] for j in range(i,n): # 右区间 if lis[j] > max: max = lis[j] if lis[j] < min: min = lis[j] if (max - min) == (j - i): res += 1print(res)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SSM项目使用拦截器实现登录验证功能
下一篇:grpc的封装扩展,集成通用的组件,形成一个微服务通讯框架.
相关文章

 发表评论

暂时没有评论,来抢沙发吧~