洛谷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]的最小值,可以用单调队列,模板贴上去后,队头就是我们想要的(单增队列,第一个就是最小的),依次统计答案即可。

posted @ 2022-04-08 19:33  YHXo  阅读(39)  评论(0编辑  收藏  举报