CSP20219——T2非零段划分

朴素思想肯定是遍历每个bar,确定在不同bar的影响下的非零段个数,但是暴力求解是O(MN)的
本题要求O(N),所以需要优化使对于每个bar的求解是O(1)的
可以用 c n t [ b a r ] cnt[bar] cnt[bar]统计每个 b a r bar bar对应的非零段个数
然后就涉及到怎么描述一个非零段的问题,也就是说什么条件下一定会存在非零段
A [ i ] < b a r < = A [ i + 1 ] A[i]<bar<=A[i+1] A[i]<bar<=A[i+1]
无论 A [ i + 1 ] A[i+1] A[i+1]之后的数如何变化,一定会存在一个非零段,此时 b a r ∈ ( A [ i ] , A [ i + 1 ] ] bar \in (A[i],A[i+1]] bar∈(A[i],A[i+1]]
也就是对区间内的 c n t [ b a r ] cnt[bar] cnt[bar]都+1
可以用一维差分来维护

/*
 * @Email: zhiyyyu@gmail.com
 * @Author: Deng Zehui
 * @Github: nArrow4
 * @Date: 2021-10-12 00:18:50
 */
#include<bits/stdc++.h>

using namespace std;

int n;
int UPPER = 10000;
vector<int> A;
int main(){
    cin >> n;
    vector<int> diff(UPPER + 1, 0);
    int pre, cur;
    pre = 0;
    for (int i = 0; i < n;i++){
        cin >> cur;
        if(cur > pre){
            diff[pre + 1]++;
            diff[cur + 1]--;
        }
        pre = cur;
    }
    int ans = 0, sum = 0;
    for (int i = 0;i < UPPER;i++){
        sum += diff[i];
        ans = max(ans, sum);
    }
    cout << ans;
    return 0;
}
上一篇:[模板题]


下一篇:选课 洛谷P2014 树形dp