CSP-2021-09-2(非零段划分)

  • 找非零段的时候可以用涨水法,遇到波峰就加一,遇到波谷减一,但是切记如果要求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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值