题目链接 https://nanti.jisuanke.com/t/38228
倍增nb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const ll maxn = 5e5 + 10;
const ll mod = 1e9 + 7;
ll bl[maxn],br[maxn];
stack<pair<ll,ll> >s;
ll summi[maxn][30],summx[maxn][30],a[maxn];
ll askmi(ll l,ll r)
{
ll len = log2(r - l + 1);
return min(summi[l][len],summi[r - (1 << len) + 1][len]);
}
ll askmx(ll l,ll r)
{
ll len = log2(r - l + 1);
return max(summx[l][len],summx[r - (1 << len) + 1][len]);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll n;
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
summx[i][0] = summx[i - 1][0] + a[i];
summi[i][0] = summx[i][0];
}
ll len = log2(n);
for(int i = 1; i <= len; i ++)
{
for(int j = 1; j + (1 << i) - 1 <= n; j ++)
{
summx[j][i] = max(summx[j][i - 1],summx[j + (1 << (i - 1))][i - 1]);
summi[j][i] = min(summi[j][i - 1],summi[j + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= n; i ++)
{
while(!s.empty() && s.top().second >= a[i])s.pop();
if(s.empty())bl[i] = 1;
else bl[i] = s.top().first + 1;
s.push(make_pair(i,a[i]));
}
while(!s.empty())s.pop();
for(int i = n; i >= 1; i --)
{
while(!s.empty() && s.top().second >= a[i])s.pop();
if(s.empty())br[i] = n;
else br[i] = s.top().first - 1;
s.push(make_pair(i,a[i]));
}
ll ma = -1e18;
for(int i = 1; i <= n; i ++)
{
if(a[i] > 0)
{
ll l = askmi(bl[i] - 1,i - 1);
ll r = askmx(i,br[i]);
ma = max((r - l) * a[i],ma);
}
else if(a[i] < 0)
{
ll l = askmx(bl[i],i - 1);
ll r = askmi(i,br[i]);
ma = max((r - l) * a[i],ma);
}
else
{
ma = max((ll)0,ma);
}
}
cout << ma << '\n';;
return 0;
}