https://codeforc.es/contest/1359/problem/D
参考了一位大佬 https://www.cnblogs.com/stelayuri/p/12986700.html
看完题解我是震惊的。
枚举最大值,如果前面区间sum小于0,就直接扔掉(sum = 0),因为留下它也是拖后腿,遇到 list[i] > mx,就重新计算区间,sum = 0.
非常巧妙,LDK都说作者好聪明呀
#include<iostream>
#include<set>
using namespace std;
const int maxn = 1e5+11;
int list[maxn];
int cns[maxn];
set<int,greater<int> >ins;
set<int>::iterator it;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>list[i];
}
int ans = 0;
int sum = 0;
for(int i=0;i<=30;i++){
sum = 0;
for(int j=1;j<=n;j++){
if(list[j] > i){
sum = 0;
continue;
}
sum += list[j];
if(sum<0) sum = 0;
ans = max(ans,sum - i);
}
}
cout<<ans<<endl;
return 0;
}