连号区间数

连号区间数

题目描述#

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

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

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

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

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

输入描述#

第一行是一个正整数 N (1 ≤ N ≤ 50 × 10^4), 表示全排列的规模。

第二行是 N 个不同的数字 P_i (1 ≤ P_i ≤ N)表示这 N 个数字的某一全排列。

输出描述#

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

输入输出样例#

示例

输入

4
3 2 4 1

输出

7

运行限制#

  • 最大运行时间:5s
  • 最大运行内存: 64M

提交答案#

#include<bits/stdc++.h>
using namespace std;
const int N=10010,INF=100000000;
int n;
int a[N];
int main()
{
  cin>>n;
  for(int i=0;i<n;i++)
  {
    cin>>a[i];
  }
  int res=0;
  for(int i=0;i<n;i++)//开始遍历这个区间
  {
    int minv=INF,maxv=-INF;//最小值从一个比较大的数开始,最大值从一个比较小的数开始
    for(int j=i;j<n;j++)//结束这个区间的遍历,所以j肯定是从大于等于i开始的
    {
      minv=min(minv,a[j]);
      maxv=max(maxv,a[j]);
      if(maxv-minv==j-i) res++;//maxv-minv==j-i满足这个条件即为连号区间
    }
  }
  cout<<res<<endl;
  return 0;
}
posted @   bujidao1128  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
主题色彩