计蒜客-MaxAnswer Posted on 2019-08-08 | Views: 题意求数组的一个子区间,使得 子区间之和 乘以 子区间最小值 最大,求最大值 题解权值可能为负,分别考虑正负,正数使用但单调栈,负数求出最小连续子段和乘以该子段的最小值 代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798#include <bits/stdc++.h>using namespace std;#define forl(i, l, r) for (int i = l; i <= r; i++)#define forr(i, r, l) for (int i = r; i >= l; i--)#define for1(i, n) for (int i = 1; i <= n; i++)#define fro1(i, n) for (int i = 1; i <= n; i++)#define for0(i, n) for (int i = 0; i < n; i++)#define fro0(i, n) for (int i = 0; i < n; i++)#define meminf(a) memset(a, inf, sizeof(a))#define mem_1(a) memset(a, -1, sizeof(a))#define mem0(a) memset(a, 0, sizeof(a))#define memcp(a,b) memcpy(a,b,sizeof(b))#define oper(type) bool operator <(const type y)const#define mp make_pair#define pu_b push_back#define pu_f push_front#define po_b pop_back#define po_f pop_front#define fi first#define se second#define whiel while#define retrun returntypedef pair<long long, long long> pll;typedef vector<long long> vll;typedef pair<int, int> pii;typedef unsigned long long ull;typedef vector<int> vii;typedef double db;typedef long long ll;typedef int itn;int in(int &a,int &b,int &c,int &d){return scanf("%d%d%d%d",&a,&b,&c,&d);}int in(int &a,int &b,int &c){return scanf("%d%d%d",&a,&b,&c);}int in(int &a,int &b){return scanf("%d%d",&a,&b);}int in(ll &a){return scanf("%lld",&a);}int in(int &a){return scanf("%d",&a);}int in(char *s){return scanf("%s",s);}int in(char &s){return scanf("%c",&s);}int in(db &a){return scanf("%lf",&a);}void out(int a){printf("%d ",a);}void outln(int a){printf("%d\n",a);}void out(ll a){printf("%lld ",a);}void outln(ll a){printf("%lld\n",a);}const db pi = acos((db)-1);const ll inf =0x3f3f3f3f;const db eps = 1e-8;const int N = 5.1e5;const int M = 2.1e5;const ll mod = 1e9+7;int sign(db a) { return a < -eps ? -1 : a > eps;}int db_cmp(db a, db b){ return sign(a-b); }stack<pll>sta; int main() {#ifdef PerpEternal // freopen("/Users/perpeternal/Documents/Sketch/data/in.dat", "r", stdin); // freopen("/Users/perpeternal/Documents/Sketch/data/out.dat", "w", stdout);#endif //ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; ll x; in(n); ll ans=0,minn=0,tot=0; for0(i,n){ in(x); if(tot+x>0){ tot=minn=0; }else{ minn=min(minn,x); tot+=x; ans=max(ans,minn*tot); } if(x<=0){ ll tmp=0; whiel(sta.size()){ tmp+=sta.top().se; ans=max(ans,sta.top().fi*tmp); sta.pop(); } }else{ ll tmp=0; while(sta.size()&&x<=sta.top().fi){ tmp+=sta.top().se; ans=max(ans,sta.top().fi*tmp); sta.pop(); } sta.push(pll(x,tmp+x)); } } ll tmp=0; whiel(sta.size()){ tmp+=sta.top().se; ans=max(ans,sta.top().fi*tmp); sta.pop(); } outln(ans); return 0;}