题意:
给一个长度为n的数列
1 :所有数的和为sum
2 :所有字段和两个正整数 (l,r(1leq l leq r leq n)),并算出 (sum_{i=l}^{r} a_i),但是不能(l=1,r=n)
如果2算出的任意值都严格小于sum,则输出YES,否则输出NO
思路:
直接找出来除(l=1,r=n)的所有字段和(sum_{i=l}^{r} a_i)的最大值与sum比较即可
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int MAXN=2e5+50;
const double pi=3.1415926536;
ll dp[MAXN],a[MAXN],sum[MAXN];
int t,n;
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d",&n);sum[0]=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];//前缀和
}
ll ma=-0x3f3f3f3f3f3f3f3f;
ll mi=0,mii=0;//mii为前面最小连续和的位置
for(int i=1;i<n;i++){
if(mi>sum[i-1]) {
mi=sum[i-1];
mii=i-1;
}
ma=max(ma,sum[i]-mi);
}
ll m=0x3f3f3f3f3f3f3f3f;
if(mii!=0)ma=max(ma,sum[n]-mi);//如果前面最小连续和的位置不为0,即l不是从1开始,可以算l-n的值的和
else{//找到从2开始的最小值m,算m-n的值的和
for(int i=1;i<n;i++)
m=min(m,sum[i]);
ma=max(ma,sum[n]-m);
}
//printf("%lld
",ma);
if(sum[n]>ma){
printf("YES
");
}
else
printf("NO
");
}
return 0;
}