对差分的敏感程度不够高,拿到这道题时没有想到用差分来解决,因此只拿到70分。后面学习了一下别人的差分做法,在这里记录一下差分版的非零段划分。
// 2109非零段划分---差分法---100分版
#include<bits/stdc++.h>
using namespace std;
const int N = 500002;
const int M = 10001;
int a[N];
int d[M]={0};
int main() {
int n;
cin >> n;
for(int i=1; i<=n; i++) {
cin >> a[i];
}
n = unique(a, a + n + 2) - a - 1;
a[0] = a[n+1] = 0;
// 遍历一般记录元素左右位置关系
for(int i=1; i<=n; i++) {
if(a[i]>a[i-1]&&a[i]>a[i+1]) {
d[a[i]]++;
}
else if(a[i]<a[i-1]&&a[i]<a[i+1]) {
d[a[i]]--;
}
}
// 数组d为差分数组,题意下前缀和应该从后往前算
int ans = 0;
int sum = 0;
for(int i=M; i>=1; i--) {
sum += d[i];
ans = max(sum, ans);
}
cout << ans << endl;
return 0;
}