单调队列

问题描述:给你一个大小为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
 
*/     


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值