zoukankan      html  css  js  c++  java
  • hdu 3415 单调队列

    sum[i]为前缀和

    对于以i结尾的一段满足要求的最大和则为x=sum[i]-sum[j-1],i-j+1<=k;

     //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    #define pb(a) push_back(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    #define PI  3.1415926535898
    template<class T> T min(const T& a,const T& b,const T& c){return min(min(a,b),min(a,c));}
    template<class T> T max(const T& a,const T& b,const T& c){return max(max(a,b),max(a,c));}
    void debug()
    {
    #ifdef ONLINE_JUDGE
    #else
        freopen("d:\in.txt","r",stdin);
        //freopen("d:\out1.txt","w",stdout);
    #endif
    }
    char getch()
    {
        char ch;
        while((ch=getchar())!=EOF)
        {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    int da[100100],sum[200200],q[200200];
    int main()
    {
        debug();
        int t;
        scanf("%d",&t);
        for(int ca=1;ca<=t;ca++)
        {
            int n,k;
            scanf("%d%d",&n,&k);
            sum[0]=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&da[i]);
                sum[i]=sum[i-1]+da[i];
            }
            for(int i=1;i<=n;i++)
            {
                sum[i+n]=sum[i+n-1]+da[i];
            }
            int front=1,rear=1;
            q[1]=0;
            int maxx=INT_MIN,ml,mr;
            for(int i=1;i<=2*n;i++)
            {
                while(front<=rear&&i-q[front]>k)front++;
                if(sum[i]-sum[q[front]]>maxx)
                {
                    maxx=sum[i]-sum[q[front]];
                    ml=q[front]+1;mr=i;
                }
                while(front<=rear&&sum[i]<sum[q[rear]])rear--;
                q[++rear]=i;
            }
            if(mr>n)mr=mr%n;
            printf("%d %d %d
    ",maxx,ml,mr);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    低版本ie模式 360兼容模式的兼容性调节以及控制代码
    360浏览器兼容模式样式乱码的原因及解决办法
    iOS开发之UILabel
    代码大全--第六章--可以工作的类
    读书笔记--软件项目成功之道
    extern "C"的用法解析(转)
    基于Ubuntu 15.04 LTS编译Android5.1.0源代码 (转)
    Global.asax 文件是什么(转)
    设备扩展(DEVICE_EXTENSION)
    IRP_MJ_CREATE
  • 原文地址:https://www.cnblogs.com/BMan/p/3261501.html
Copyright © 2011-2022 走看看