地址:http://acm.hdu.edu.cn/showproblem.php?pid=3415
题意:给一个序列,规定区间大小,求和最大的子序列。
mark:单调队列。。。经验不足,做了很久。
代码:
#include <stdio.h> #include <string.h> const int M = 100010; int sum[2*M], a[2*M], q[2*M]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); int t,n,m,max; int i,fr,la,f1,f2; scanf("%d", &t); while(t-- && scanf("%d%d", &n, &m)) { for(i = 0; i < n; i++) { scanf("%d", a+i); a[i+n] = a[i]; } sum[0] = a[0]; for(i = 1; i < 2*n; i++) sum[i] = sum[i-1]+a[i]; max = a[0]; fr = la = 0; f1 = f2 = 0; for(i = 2*n-1; i >= 0; i--) { if(fr == la) { q[la++] = i; continue; } while(fr != la && sum[q[la-1]]-sum[i] <= 0) la--; q[la++] = i; while(q[fr] - q[la-1] >= m) fr++; if(sum[q[fr]]-sum[q[la-1]]+a[q[la-1]] >= max) { max = sum[q[fr]]-sum[q[la-1]]+a[q[la-1]]; f1 = q[la-1]; f2 = q[fr]; } } printf("%d %d %d\n", max, f1%n+1, f2%n+1); } return 0; }