小明这些天一直在思考这样一个奇怪而有趣的问题:在 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;
}