D. Extreme Subtraction ###K ###K ###K //K
题目链接:https://codeforces.ml/problemset/problem/1442/A
题意:给定一数组 可以从前缀或者后缀一直减1 问是否能让该数组全部变为零
思路:每次操作是一段的区间操作, 那么考虑转换成差分数组变成单点操作
转换为差分数组后 如果要使得数组中的全部元素为0 那么即 a[i] i~n都为0
前缀操作的话 是能够 使a[1]-1 并且使得某a[i]+1 后缀操作的话 是可以使得a[n+1]+1 某a[i]-1
所以要使得差分数组为0的话 后缀操作可以随意使用 来确保差分数组中大于0的数全部归0
而前缀操作则每次付出a[1]-1的代价 使得 差分数组中小于0的数 +1靠近0 所以只需要判断 差分数组中的负数的绝对值是否大于a[1]即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn =3e4+10; 6 const int mod=1e9+7; 7 int a[maxn]; 8 9 10 11 int main() 12 { 13 ios::sync_with_stdio(false); 14 cin.tie(0); 15 int t; 16 cin>>t; 17 while(t--) 18 { 19 int n; 20 cin>>n; 21 for(int i=1;i<=n;i++) 22 { 23 cin>>a[i]; 24 } 25 ll sum=0; 26 for(int i=n;i>=1;i--) 27 a[i]-=a[i-1]; 28 for(int i=2;i<=n;i++) 29 { 30 if(a[i]<0) 31 sum+=abs(a[i]); 32 } 33 if(sum>a[1]) 34 cout<<"NO"<<'\n'; 35 else 36 cout<<"YES"<<'\n'; 37 } 38 39 40 41 42 }

浙公网安备 33010602011771号