CF【1313C2】单调栈+魔改前缀和

题意
给出n个数,第i个数为a[i],要找到一个单峰序列b,其中b[i]<=a[i],要使其和最大,输出序列之和最大情况下的b序列。
题解
对于a[i]用单调栈找一下它左边第一个小于它的数(记为l[i])和它右边第一个小于它的数(记为r[i]),然后分别统计一下左边的前缀和和右边的前缀和(此时的前缀和公式应该是suml[i] = sum[l[i]] + a[i] * (i - l[i])),然后枚举一下最高点统计答案。
代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 5e5 + 5;
ll n, t, m, h, ans, k, a[maxn], l[maxn], r[maxn], suml[maxn], sumr[maxn], res[maxn], s[maxn];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n;
    for(ll i = 1; i <= n; i++) cin >> a[i];
    for(ll i = 1; i <= n; i++){
        while(t && a[s[t]] >= a[i]) t--;
        if(t) l[i] = s[t];
        s[++t] = i;
    }
    memset(s, 0, sizeof(s)); t = 0;
    for(ll i = n; i >= 1; i--){
        while(t && a[s[t]] >= a[i]) t--;
        if(t) r[i] = s[t];
        else r[i] = n + 1;
        s[++t] = i;
    }
    for(ll i = 1; i <= n; i++) suml[i] = suml[l[i]] + (i - l[i]) * a[i];
    for(ll i = n; i >= 1; i--) sumr[i] = sumr[r[i]] + (r[i] - i) * a[i];
    for(ll i = 1; i <= n; i++) if(ans < suml[i] + sumr[i] - a[i]) ans = suml[i] + sumr[i] - a[i], k = i;
    res[k] = a[k], m = a[k], h = a[k];
    for(ll i = k - 1; i >= 1; i--){
        if(a[i] > m) res[i] = m;
        else res[i] = a[i], m = a[i];
    }
    for(ll i = k + 1; i <= n; i++){
        if(a[i] > h) res[i] = h;
        else res[i] = a[i], h = a[i];
    }
    for(ll i = 1; i <= n; i++) cout << res[i] << " ";
    cout << endl;

    return 0;
}
全部评论

相关推荐

评论
2
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10999次浏览 94人参与
# 你的实习产出是真实的还是包装的? #
1943次浏览 42人参与
# 巨人网络春招 #
11361次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7628次浏览 43人参与
# 简历第一个项目做什么 #
31736次浏览 339人参与
# 重来一次,我还会选择这个专业吗 #
433536次浏览 3926人参与
# MiniMax求职进展汇总 #
24114次浏览 309人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187191次浏览 1122人参与
# 牛客AI文生图 #
21445次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152441次浏览 888人参与
# 研究所笔面经互助 #
118960次浏览 577人参与
# 简历中的项目经历要怎么写? #
310349次浏览 4217人参与
# AI时代,哪些岗位最容易被淘汰 #
63803次浏览 826人参与
# 面试紧张时你会有什么表现? #
30509次浏览 188人参与
# 你今年的平均薪资是多少? #
213128次浏览 1039人参与
# 你怎么看待AI面试 #
180122次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64331次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76537次浏览 374人参与
# 我的求职精神状态 #
448121次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363503次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160672次浏览 1112人参与
# 校招笔试 #
471140次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务