题解 |

金币

https://ac.nowcoder.com/acm/contest/53642/G

用单调队列存范围内最小的前缀和,从前往后遍历更新值和单调队列即可

#include <bits/stdc++.h>
typedef long long ll;
const ll maxn=3e5+5;
using namespace std;

ll n,m;
ll a[maxn];
ll fro[maxn];
ll ans=-1e12;
ll que[maxn];

int main(){
ll i,j;

cin>>n>>m;
for(i=1;i<=n;i++)
{
    scanf("%lld",&a[i]);
    fro[i]=fro[i-1]+a[i];
}
ll l=0,r=-1;
que[++r]=0;

for(i=1;i<=n;i++)
{
    while(l<=r&&i-que[l]>m) l++;
    if(l<=r)    ans=max(ans,fro[i]-fro[que[l]]);
    while(l<=r&&fro[i]<=fro[que[r]]) r--;
    que[++r]=i;
}

printf("%lld\n",ans);
    
}
全部评论

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
cpp苦手:一眼ddl
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务