朴素思想肯定是遍历每个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;
}