1210. 连号区间数
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 \neq 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;
}