hdu 3415

单调队列

参考资料:http://wenku.baidu.com/view/432e4c2ce2bd960590c677c6.html

第一次写,粗心地把最后输出语句的%n写成了%k,搞了好久

#include "stdio.h"

#define M 100010

typedef struct _Node{
	int val;
	int pos;
}Node, *pNode;

Node que[M<<1];
int fro, end;
int num[M], sum[M<<1];

void main(){
	int c, i, j;
	int n, k;
	int mm, s, e;
	freopen("in.txt", "r", stdin);
	scanf("%d", &c);
	while(c--){
		scanf("%d %d", &n, &k);
		sum[0] = 0;
		for(i=1; i<=n; i++){
			scanf("%d", num+i);
			sum[i] = sum[i-1] + num[i];
		}
		for(i--, j=1; j<k; j++) sum[i+j] = sum[i+j-1] + num[j];

		que[0].val = 0; que[0].pos = 0;
		fro = 0; end = 1;
		mm = 0x80000000;
		for(i=1; i<n+k; i++){
			while(fro<end && que[fro].pos<i-k){
				fro++;
			}
			if(mm < sum[i]-que[fro].val){
				mm = sum[i]-que[fro].val;
				s = que[fro].pos+1;
				e = i;
			}
			while(fro<end && sum[i]<que[end-1].val){
				end--;
			}
			que[end].val = sum[i];
			que[end].pos = i;
			end++;
		}
		printf("%d %d %d\n", mm, s, e>n?(e%n):e);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值