【CSU 1529】Equator (前缀和,双端队列)

Equator


Description
Description


Input
这里写图片描述

Output
这里写图片描述


Sample Input
3
3 1 2 3
8 4 5 -1 -1 1 -1 -1 5
2 -1 -1
Sample Output
6
14
0


题意:

输入数据:T数据组数
接下来T行,第一个数字n为个数。接下来有n个数(正/负都可能有)。求出这些数字(要保证相邻)最大的和。


思路:

用前缀和法预处理出数组每个数的前缀和。扩充至2*MAX以便双端队列的处理,之后用双端队列求出最大的和。

代码示例:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std; 
#define MAX 1000005
int a[2*MAX],sum[2*MAX];
int deque[2*MAX];//双端队列 
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n ;
        cin>>n;
        for(int i=1;i<=n;i++) 
        {
            cin>>a[i];
            a[i+n]=a[i];
        }
        for(int i=1;i<n*2;i++)
            sum[i]=sum[i-1]+a[i];

        int ans=0;
        int start=0,tail=-1; 
        for(int i=1;i<2*n;i++)
        {
            while(start<=tail&&sum[i]<sum[deque[tail]])
            {
                ans=max(ans,sum[deque[tail]]-sum[deque[start]]);
                tail--;
            }
            while(start<=tail&&i-deque[start]>n)
            {
                ans=max(ans,sum[deque[tail]]-sum[deque[start]]);
                start++;
            }
            deque[++tail]=i;
         } 

         ans=max(ans,sum[deque[tail]]-sum[deque[start]]);
         cout<<ans<<endl;
    }



   return 0; 
} 

猜你喜欢

转载自blog.csdn.net/chen_yuazzy/article/details/77074793