单调栈WA求调
查看原帖
单调栈WA求调
974277
水星湖psgqwq楼主2024/4/23 22:09
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, a[1000005], l[1000005], r[1000005], sum[1000005];
stack<int>s;
signed main()
{
    bool f = 0;
    while(cin >> n){
        if(f) cout << '\n';
        else f = 1;
        int flag = 0;
        while(!s.empty()) s.pop();
        for(int i = 1; i <= n; i++)
            cin >> a[i];
        for(int i = 1; i <= n; i++)
            sum[i] = sum[i-1] + a[i];
        for(int i = 1; i <= n; i++){
            while(!s.empty() && a[s.top()] >= a[i]) s.pop();
            l[i] = s.empty()? 0: s.top() + 1;
            s.push(i);
        }
        while(!s.empty()) s.pop();
        for(int i = n; i >= 1; i--){
            while(!s.empty() && a[s.top()] >= a[i]) s.pop();
            r[i] = s.empty()? n: s.top() - 1;
            s.push(i);    
        }
        int ans = 0, lans = 1, rans = 1, len = 1;
        for(int i = 1; i <= n; i++){
            int k = a[i] * (sum[r[i]] - sum[l[i] - 1]);
            if(k > ans){
                ans = k, lans = l[i], rans = r[i], len = r[i] - l[i];
            }
            else if(k == ans){
                if(r[i] - l[i] < len)
                    lans = l[i], rans = r[i], len = r[i] - l[i];
                if(r[i] - l[i] == len && l[i] < lans)
                    lans = l[i], rans = r[i], len = r[i] - l[i];
            }
        }
        cout << ans << '\n' << lans << " " << rans << '\n';
    }
    return 0;
}
2024/4/23 22:09
加载中...