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;
}
posted @ 2020-09-17 10:42  yys_c  阅读(124)  评论(0编辑  收藏  举报