a[1] ~ a[N]存储1~N的一个排列
枚举一个区间[l, r]:a[l], a[l + 1], ..., a[r], 如果区间[l, r] 的max - min = r - l可以推出[l, r]为一个连号区间。
证明:
(因为数组a存储1到N的全排列,所以a[l] - a[r]中不存在重复元素。\ 现在将a[l]到a[r]升序排列, 那么max = a[r], min = a[l]\ 假设[l, r]不是连号区间,即存在i, in [l, r]使得a[i+ 1] - a[i] gt 1\ 所以max - min \>= (a[l + 1] - a[l]) + (a[l + 2] - a[l + 1]) + ... + (a[i + 1] - a[i]) + ... + a[r] - a[r - 1] \>= (r - l - 1) + a[i + 1] - a[i]\ 所以可以得到max - min - r + l + 1 > 1\ 所以max - min > r - l eq r - l)
所以可以得到非连号区间max - min ≠ r - l, 所以当max - min = r - l 时,[l, r]为连号区间。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010, INF = 0x3f3f3f3f;
int a[N];
int n;
int main(){
cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
int res = 0;
int mn, mx;
for(int i = 1; i <= n; i ++){
mx = -INF, mn = INF;
for(int j = i; j <= n; j ++){
mx = max(mx, a[j]), mn = min(mn, a[j]);
if(mx - mn == j - i) res ++;
}
}
cout << res << endl;
return 0;
}