单调队列

来源:互联网 发布:淘宝产品分类 编辑:程序博客网 时间:2024/06/06 04:00

问题描述:给你一个大小为N的数组,再给你一个K值,要你计算[1,K],[2,K+1],[3,K+2],……,[N-K+1,N]这几段区间的最大值的和并输出。

#include<cstdio>#include<cstring>struct queue{int data[100005];int lp;int rp;queue(){memset(data,0,sizeof(data));lp=rp=0;}void push(int a){data[rp++]=a;}void pop_l(){lp++;}void pop_r(){rp--;}int front(){return data[lp];}int back(){return data[rp-1];}bool empty(){if(lp==rp)return 1;else return 0;}}q;int num[100005]={101};int main(){int n,k,i,ans=0;scanf("%d%d",&n,&k);for(i=1;i<=n;i++)scanf("%d",&num[i]);for(i=1;i<k;i++){while(!q.empty()&&num[q.back()]<num[i])q.pop_r();q.push(i);}for(;i<=n;i++){if(q.front()==i-k)q.pop_l();while(!q.empty()&&num[q.back()]<num[i])q.pop_r();q.push(i);ans+=num[q.front()];//printf("%d\n",ans);}printf("%d\n",ans);return 0;}                         /*输入示例:10 35 8 6 2 3 7 4 2 2 9输出示例:56 */     


0 0
原创粉丝点击