问题描述:给你一个大小为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 3
5 8 6 2 3 7 4 2 2 9
输出示例:
56
*/