zoukankan      html  css  js  c++  java
  • 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 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;
    }
    
  • 相关阅读:
    002变量
    001Java输入、eclipse快捷键
    040同步条件event
    kali配置ip,更新源,更新签名
    039条件变量同步(Condition)
    038信号量
    037多线程同步
    配置java环境变量(详细)
    提高你的Python能力:理解单元测试
    电影里的代码之《机械姬》:筛法求质数
  • 原文地址:https://www.cnblogs.com/tomori/p/13683803.html
Copyright © 2011-2022 走看看