单调队列
参考资料: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);
}
}