洛谷P1714 切蛋糕(单调队列)
先放代码......
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e5+10,M=0x3f3f3f3f; 4 int n,m,a[N],sum[N]; 5 int q[N],ans=-M; 6 7 int main(){ 8 scanf("%d%d",&n,&m); 9 for(int i=1;i<=n;i++){ 10 scanf("%d",&a[i]); 11 sum[i]=sum[i-1]+a[i]; 12 } 13 int head=1,tail=0; 14 for(int i=1;i<=n;i++){//注意维护的是r和l-1,而不是l和r 15 while(head<=tail && sum[i-1]<=sum[q[tail]]) tail--; 16 q[++tail]=i-1; 17 while(head<=tail && q[head]<i-m) head++; 18 ans=max(ans,sum[i]-sum[q[head]]); 19 } 20 cout<<ans; 21 }
这道题的重要点:前缀和 ;对于每一个r,它l的可行范围是r-m+1~r ;题目要求这个区间的长度范围是1~m ;sum[r]-sum[l-1],求这段最大值,即要维护sum[l-1]的最小值,可以用单调队列,模板贴上去后,队头就是我们想要的(单增队列,第一个就是最小的),依次统计答案即可。