Equator
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;
}