题意:
如果有[l,r]这一段的和比数组总和大,就是NO,否则就是YES
思路:
就一段一段判断就可以。如果加和之后比a[i]还小,那就从a[i]从新开始计数。从一开始之后还要从2开始一遍,因为从一开始的,无法忽略不存在1的这种情况。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,k,t,mod=1e9+7,s,ans=0;
long long a[100001],b[100001];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
s=0;
ans=0;
int flag=1,l=1,r=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
b[i]=s;
}
for(int i=1;i<n;i++)
{
ans=max(ans+a[i],a[i]);
if(ans>=s)
flag=0;
}
ans=0;
for(int i=2;i<=n;i++)
{
ans=max(ans+a[i],a[i]);
if(ans>=s)
flag=0;
}
if(flag==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}