因为区间修改,可以联想到差分上面去。
因为都是从前往后的一段和从后往前的一段,如果当前位置比前面位置要大,那么一定要从后往前操作差值大小次数
这样我们计算出必须要操作的次数后,不断在过程中判断是否非法,也就是操作次数是否超过当前值的大小
最后如果符合那就是yes
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int N=4e6+10; const ll mod=998244353; int a[N]; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int n; cin>>n; int i; for(i=1;i<=n;i++){ cin>>a[i]; } ll ans=0; int flag=0; for(i=2;i<=n;i++){ if(ans>a[i]){ flag=1; break; } if(a[i-1]<a[i]){ ans+=(a[i]-a[i-1]); } } if(flag){ cout<<"NO"<<endl; } else{ cout<<"YES"<<endl; } } }