C. Ian and Array Sorting codeforces1816C
思路:因为我们既可以使数字+1,也可以-1,所以我们只需要考虑将每个数字都变成什么样,我们不妨尝试让所有数字都相等,这里让他们都等于a[n],那么对于i属于2~n-1的数,我们从后到前遍历,令它变成i+1的数,并令i-1的数做对应修改,依次维护直到所有数操作完,因为必须两两操作,所以我们发现a[1]可能大于其他数,这是如果n是奇数,那么可以令后面每两个数都+到和a[1]相等,如果是偶数则没有办法。
·
题目大意:有一个长度为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;
}
更多推荐
所有评论(0)