-
找非零段的时候可以用
涨水法
,遇到波峰就加一,遇到波谷减一,但是切记如果要求max
,那么一定是先减后加,否则有可能超出最大的范围
#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;
struct Node {
int val;
int isHigh;
};
void solve() {
int n; cin >> n;
vector<Node> v(n);
int cnt = 0;
while (n--) {
cin >> v[cnt].val;
if (cnt > 0 && v[cnt].val == v[cnt-1].val) cnt--;
cnt++;
}
if (cnt == 1) {
if (v[0].val == 0) cout << 0 << endl;
else cout << 1 << endl;
return ;
}
if (v[0].val > v[1].val) v[0].isHigh = 1;
else if (v[0].val < v[1].val) v[0].isHigh = 0;
if (v[cnt-1].val > v[cnt-2].val) v[cnt-1].isHigh = 1;
else if (v[cnt-1].val < v[cnt-2].val) v[cnt-1].isHigh = 0;
for (int i = 1; i < cnt - 1; ++i) {
if (v[i].val > v[i-1].val && v[i].val > v[i+1].val) {
v[i].isHigh = 1;
} else if (v[i].val < v[i-1].val && v[i].val < v[i+1].val) {
v[i].isHigh = 2;
}
}
auto cmp = [](Node a, Node b) {
if (a.val != b.val) {
return a.val > b.val;
} else {
return a.isHigh > b.isHigh;
}
};
sort(v.begin(), v.begin() + cnt, cmp);
int res = 0, MAX = 0;;
for (int i = 0; i < cnt; ++i) {
if (v[i].isHigh == 1) res ++;
else if (v[i].isHigh == 2) res --;
// cout << v[i].val << " " << v[i].isHigh << endl;
MAX = max(res, MAX);
}
cout << MAX << endl;
}
int main() {
// ios::sync_with_stdio(false);
// cin.tie(0);
solve();
return 0;
}