题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3415
题意:给出一个环形数列,求出一个长度不大于K的连续子列使得子列的和最大?
思路:维护一个单调队列,使得队头元素位置作为数列的开始位置总是最优的。那么如何保持这一特性呢?那么对于当前的i,可能是当前或者以后的最优区间头,所以需要插入。而q[tail-1]是队列最后一个元素,如果区间[q[tail-1], i-1]的和小于0,要让q[tail-1]作为区间头的话,必然不是最优,因此踢出队列;反之队尾作为开始比i更优。
int n,m,a[N],f[N];int Q[N],head,tail;int main(){ int C; RD(C); while(C--) { RD(n,m); int i; FOR1(i,n) RD(a[i]); FOR1(i,m-1) a[i+n]=a[i]; FOR1(i,n+m-1) f[i]=f[i-1]+a[i]; int sum=-INF,L,R,temp; head=tail=0; FOR1(i,n+m-1) { while(head<0) { tail--; } Q[tail++]=i; while(head m) head++; temp=f[i]-f[Q[head]-1]; if(temp>sum) sum=temp,L=Q[head],R=i; } if(L>n) L-=n; if(R>n) R-=n; PR(sum,L,R); } return 0;}