zoukankan      html  css  js  c++  java
  • hdu3415(单调队列)

    Max Sum of Max-K-sub-sequence

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 10481    Accepted Submission(s): 3853


    Problem Description
    Given a circle sequence A[1],A[2],A[3]......A[n]. Circle sequence means the left neighbour of A[1] is A[n] , and the right neighbour of A[n] is A[1].
    Now your job is to calculate the max sum of a Max-K-sub-sequence. Max-K-sub-sequence means a continuous non-empty sub-sequence which length not exceed K.
     
    Input
    The first line of the input contains an integer T(1<=T<=100) which means the number of test cases.
    Then T lines follow, each line starts with two integers N , K(1<=N<=100000 , 1<=K<=N), then N integers followed(all the integers are between -1000 and 1000).
     
    Output
    For each test case, you should output a line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the minimum start position, if still more than one , output the minimum length of them.
     
    Sample Input
    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
     
    Sample Output
    7 1 3 7 1 3 7 6 2 -1 1 1
    用sum数组存前缀和,a【i.....j]=sum[j]-sum[i-1];max(a[1....j])=sum[j]-min(sum[i-1])    j-(i-1)<=k;
    用单调栈维护最小的sum[i-1]即可;
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n,m;int a[100005],sum[200100],q[200100];
    int start,endi,total;int res;int ans;
    void get()
    {
    	int head=0,tail=0;
    	 ans=-100000000;
    	for(int i=1;i<total;i++)
    	{
    		while(head<tail&&sum[q[tail-1]]>=sum[i-1])tail--;
    		while(head<tail&&q[head]<i-m)head++;
    		q[tail++]=i-1;
    		if(sum[i]-sum[q[head]]>ans)
    		{
    			start=q[head];
    			endi=i;
    			ans=sum[endi]-sum[start];
    		}
    	}
    } 
    int main()
    {
    	int t;scanf("%d",&t);
    	while(t--)
    	{
    		cin>>n>>m;sum[0]=0;
    		for(int i=1;i<=n;i++)
    		{
    			cin>>a[i];
    			sum[i]=sum[i-1]+a[i];
    		}
    		for(int i=1;i<m;i++)
    		sum[n+i]=sum[n+i-1]+a[i];
    		total=n+m;
    		get();
    		start++;
    		if(start>n)start-=n;
    		if(endi>n)endi-=n;
    		 cout<<ans<<" "<<start<<" "<<endi<<endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    According to TLD or attribute directive in tag file, attribute end does not accept any expressions
    Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.
    sql注入漏洞
    Servlet—简单的管理系统
    ServletContext与网站计数器
    VS2010+ICE3.5运行官方demo报错----std::bad_alloc
    java 使用相对路径读取文件
    shell编程 if 注意事项
    Ubuntu12.04下eclipse提示框黑色背景色的修改方法
    解决Ubuntu环境变量错误导致无法正常登录
  • 原文地址:https://www.cnblogs.com/flyljz/p/11385005.html
Copyright © 2011-2022 走看看