Hungry3

梦想到达塔顶的蜗牛

hdu 3415 单调队列 先求[1,i]的和,然后循环的,延迟一倍处理一下,令sum单调

#include<cstdio>
#include<iostream>
using namespace std;
#define inf (1<<30)
const int maxn=200100;
int p[maxn];
int sum[maxn],x[maxn];
int main()
{
    int i,j,t,k;
    int n,m;
    int head,tail;
    int ans;
    int tL1,tL2;
    int L,R;
    cin>>t;
    while(t--)
    {
        scanf("%d%d",&n,&k);
        sum[0]=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&x[i]);
            sum[i]=sum[i-1]+x[i];
        }
        for(i=n+1;i<=n+k-1;i++)
        {
            sum[i]=sum[i-1]+x[i-n];
        }
        head=0;
        tail=-1;
        ans=-inf;
        for(i=1;i<=n+k-1;i++)
        {
            while(head<=tail&&sum[p[tail]]>sum[i-1])
            tail--;
            p[++tail]=i-1;
            if(i-p[head]>k)head++;
            if(sum[i]-sum[p[head]]>ans)
            {
                ans=sum[i]-sum[p[head]];
                L=p[head]+1;
                R=i;
            }

        }
        if(R>n)R-=n;
        printf("%d %d %d\n",ans,L,R);
    }
}
/*
4
6 3
6 -1 2 -6 5 -5
6 4
6 -1 2 -6 5 -5
6 3
-1 2 -6 5 -5 6
6 6
-1 -1 -1 -1 -1 -1
*/
View Code

 


posted on 2013-11-08 23:25  Hungry3  阅读(138)  评论(0)    收藏  举报

导航