CF1442A Extreme Subtraction

文章讨论了如何通过一系列操作,每次选择数组中部分元素减一或减去相同数量的数组末尾元素,使得所有数组元素变为零。核心是将问题转化为差分数组的处理,分析两种操作对差分数组的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 1kn 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 1t30000 ) — 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 1n30000 ) — 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 a1an ( 1 ≤ a i ≤ 1 0 6 1 \le a_i \le 10^6 1ai106 ).

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 t30000 ∑ n ≤ 30000 \sum n \le 30000 n30000 a i ≤ 10 6 a_i \le {10}^6 ai106

样例 #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 1d[1]−1d[i+1]+1。那么我们就可以凭借操作 1 1 1,将差分数组中的负数变成 0 0 0,同时减小 d 1 d_1 d1

操作 2 2 2d[i+1]−1d[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;
}

完结撒花~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值