Extreme Subtraction
题目描述
You are given an array a a a of n n n positive integers.
You can use the following operation as many times as you like: select any integer 1 ≤ k ≤ n 1 \le k \le n 1≤k≤n and do one of two things:
- decrement by one k k k of the first elements of the array.
- decrement by one k k k of the last elements of the array.
For example, if n = 5 n=5 n=5 and a = [ 3 , 2 , 2 , 1 , 4 ] a=[3,2,2,1,4] a=[3,2,2,1,4] , then you can apply one of the following operations to it (not all possible options are listed below):
- decrement from the first two elements of the array. After this operation a = [ 2 , 1 , 2 , 1 , 4 ] a=[2, 1, 2, 1, 4] a=[2,1,2,1,4] ;
- decrement from the last three elements of the array. After this operation a = [ 3 , 2 , 1 , 0 , 3 ] a=[3, 2, 1, 0, 3] a=[3,2,1,0,3] ;
- decrement from the first five elements of the array. After this operation a = [ 2 , 1 , 1 , 0 , 3 ] a=[2, 1, 1, 0, 3] a=[2,1,1,0,3] ;
Determine if it is possible to make all the elements of the array equal to zero by applying a certain number of operations.
输入格式
The first line contains one positive integer t t t ( 1 ≤ t ≤ 30000 1 \le t \le 30000 1≤t≤30000 ) — the number of test cases. Then $ t $ test cases follow.
Each test case begins with a line containing one integer n n n( 1 ≤ n ≤ 30000 1 \le n \le 30000 1≤n≤30000 ) — the number of elements in the array.
The second line of each test case contains n n n integers a 1 … a n a_1 \ldots a_n a1…an ( 1 ≤ a i ≤ 1 0 6 1 \le a_i \le 10^6 1≤ai≤106 ).
The sum of $ n $ over all test cases does not exceed 30000 30000 30000 .
输出格式
For each test case, output on a separate line:
- YES, if it is possible to make all elements of the array equal to zero by applying a certain number of operations.
- NO, otherwise.
The letters in the words YES and NO can be outputed in any case.
题面翻译
你有一个序列 a a a,你可以进行 2 2 2 种操作:
- 选择前 k k k 个数,将它们全部减 1 1 1
- 选择后 k k k 个数,将它们全部减 1 1 1
k
k
k 由你自己定,并且每次操作可以不同。
问是否可以把通过若干次操作整个序列变为全是
0
0
0 的序列
本题多测,有
t
t
t 组数据
t
≤
30000
t \le 30000
t≤30000,
∑
n
≤
30000
\sum n \le 30000
∑n≤30000,
a
i
≤
10
6
a_i \le {10}^6
ai≤106
样例 #1
样例输入 #1
4
3
1 2 1
5
11 7 9 6 8
5
1 3 1 3 1
4
5 2 1 10
样例输出 #1
YES
YES
NO
YES
思路:
将此题目转化成一个差分问题。要使数组中的全部数都为 0 0 0,那么差分数组也必须为 0 0 0 且 d 1 = 0 d_1 = 0 d1=0。
那么我们来看两种操作对于差分数组有何影响:
操作
1
1
1:d[1]−1
且 d[i+1]+1
。那么我们就可以凭借操作
1
1
1,将差分数组中的负数变成
0
0
0,同时减小
d
1
d_1
d1。
操作
2
2
2:d[i+1]−1
且 d[n+1]+1
。那么我们就可以凭借操作
2
2
2,将差分数组中的正数变成
0
0
0,而
d
n
+
1
d_{n+1}
dn+1 为多少和我们并没有关系。
在最开始时
d
1
=
a
1
d_1=a_1
d1=a1,所以只要差分数组的负数和的绝对值小于等于
a
1
a_1
a1,即输出 YES
,否则输出 NO
。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int INF=0x3f3f3f3f;
int T,n,a[N],b[N],s;
signed main(){
cin>>T;
while(T--){
s=0;
cin>>n;
for(int i=1;i<=n;i++){
a[i]=b[i]=0;
}
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i]-a[i-1];
}
for(int i=2;i<=n;i++){
if(b[i]<0){
s-=b[i];
}
}
if(s<=a[1]){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
完结撒花~