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; }