连号区间数

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

的某个排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间 [L,R][L,R]

里的所有元素(即此排列的第 LL

个到第 RR

个元素)递增排序后能得到一个长度为 R−L+1R−L+1

的“连续”数列,则称这个区间连号区间。当 NN

很小的时候,小明可以很快地算出答案,但是当 NN

变大的时候,问题就不是那么简单了,现在小明需要你的帮助。输入格式第一行是一个正整数 NN

,表示排列的规模。第二行是 NN

个不同的数字 PiPi

,表示这 NN

个数字的某一排列。输出格式输出一个整数,表示不同连号区间的数目。数据范围1≤N≤100001≤N≤10000

,
1≤Pi≤N1≤Pi≤N

输入样例1:4
3 2 4 1
输出样例1:7
输入样例2:5
3 4 2 5 1
输出样例2:9
样例解释第一个用例中,有 77

个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4][1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4]

第二个用例中,有 99

个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[3,3],[4,4],[5,5]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010;
int a[N];
int main(){
 int n;
 scanf("%d", &n);
 for (int i = 1; i <= n; i ++)   scanf("%d", &a[i]);
  int res = 0;
 for (int l = 1; l <= n; l ++){
  int minv = 0x3f3f3f3f, maxv = -0x3f3f3f3f;
  for (int r = l; r <= n; r ++){
       minv = min(minv, a[r]);
       maxv = max(maxv, a[r]);
      if (maxv - minv == (r - l))   res ++;
  }
 }
  cout << res << endl;
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值