码迷,mamicode.com
首页 > 其他好文 > 详细

[Agc005D/At2060] Minimum Sum - 单调栈

时间:2020-02-07 00:49:07      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:pac   答案   names   define   nim   amp   com   efi   info   

鉴于早上那题让我怀疑单调栈白学,特意来复习下单调栈

题意

技术图片

考虑按照每个元素对答案的贡献来统计,那么我们只需要找到每个元素左边右边第一个比它小的就可

这题给的又是排列,简直不能再良心

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;

int s[N],top,a[N],l[N],r[N],n,ans;

signed main() {
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++) {
        while(top && a[i]<a[s[top]]) r[s[top]]=i, --top;
        s[++top]=i;
    }
    while(top) r[s[top]]=n+1, --top;
    for(int i=n;i>=1;--i) {
        while(top && a[i]<a[s[top]]) l[s[top]]=i, --top;
        s[++top]=i;
    }
    while(top) l[s[top]]=0, --top;
    for(int i=1;i<=n;i++) {
        ans += a[i] * (r[i]-i) * (i-l[i]);
    }
    cout<<ans;
}

[Agc005D/At2060] Minimum Sum - 单调栈

标签:pac   答案   names   define   nim   amp   com   efi   info   

原文地址:https://www.cnblogs.com/mollnn/p/12271491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!