Problem - C - Codeforces

题目大意:有一个长度为n的数组a,每次操作可以将相邻的两个数分别+1,或分别-1,问能否使这个数组变成非递增数组

2<=n<=3e5;1<=ai<=1e9

思路:因为我们既可以使数字+1,也可以-1,所以我们只需要考虑将每个数字都变成什么样,我们不妨尝试让所有数字都相等,这里让他们都等于a[n],那么对于i属于2~n-1的数,我们从后到前遍历,令它变成i+1的数,并令i-1的数做对应修改,依次维护直到所有数操作完,因为必须两两操作,所以我们发现a[1]可能大于其他数,这是如果n是奇数,那么可以令后面每两个数都+到和a[1]相等,如果是偶数则没有办法

//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
typedef long long ll;
ll a[N];//注意数据范围
int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--)
	{
		int n;
		cin >> n;
		for (int i = 1; i <= n; i++)
		{
			cin >> a[i];
		}
		ll ne = a[n] - a[n - 1];
		for (int i = n-1; i >= 2; i--)
		{
			a[i] += ne;//令每个数等于a[n]
			a[i - 1] += ne;//i-1也要对应修改
			ne = a[i] - a[i - 1];//下一个数要修改的数值
		}
		if (a[1] > a[2] && n % 2 == 0)
		{//只有这种情况不行
			cout << "No" << endl;
		}
		else
		{
			cout << "YES" << endl;
		}
	}
	return 0;
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐