题解:P17444 极差数组操作 / Range Minimization
jellye
·
·
题解
题意
给定序列 a,可以令任意两个元素一个减 1,一个加 3,求操作任意次后 \max_{i=1}^{n} a_i - min_{i=1}^{n} a_i 的最小值。
思路
$n = 2$ 时,令 $x = | a_1 - a_2 | \bmod 4$,则最小极差为 $\min(x, 4 - x)$。
$n \ge 3$ 时,我们分别操作 $(x,y),(y,x)$,可以让 $x,y$ 分别 $+2$。进一步地,我们可以让 $a$ 中任意 $k$ 个元素 $+ 2 \times p$,其中 $k \ge 2$,$p \ge 1$。这样,我们就可以将 $a$ 变为只由 $x$ 与 $x + 1$ 组成的序列,此时极差为 $1$。
考虑 $x \ge 3$ 时,$a$ 满足什么条件可以使 $a$ 中所有元素相等(此时极差为 $0$)。我们让 $a$ 中除 $x$ 以外的元素都 $+ 4$,然后让 $x + 3,y - 1$,这相当于让 $x,y$ 都 $- 1$。
$n$ 是奇数时,对于任意一个 $a_i = x$,我们可以让剩下 $n - 1$ 个数两两 $- 1$,这等价于令 $a_i + 1$。因此我们可以做到 $a$ 中所有元素相等,极差为 $0$。
$n$ 是偶数时,$a$ 中的奇数个数与偶数个数相等,我们对它们进行分类讨论:
- 情况一:均为偶数。此时我们可以将奇偶性相同的数两两配对,将大数不断 $- 2$ 直到等于小数,然后两者不断 $- 1$ 直到为 $0$。这样 $a$ 中所有元素相等,极差为 $0$。
- 情况二:均为奇数。这时无法两两配对,就不能将极差变为 $0$。因此极差为 $1$。
但是更改过程中,两者数量是不断变化的。考虑计算 $S = \sum_{i=1}^{n} a_i $。由于一次操作后 $S$ 加了 $2$,$S \bmod 2$ 的值是不变的。对应地,如果是情况一,$S$ 为偶数;如果是情况二,$S$ 为奇数。
## 复杂度分析
记所有测试用例的 $n$ 之和为 $N$,则时间复杂度为 $O(N)$。
## 代码
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=200005;
int t,n,a[N];
signed main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
if(n==1) cout<<0;
else if(n==2)
{
int x=abs(a[1]-a[2])%4;
cout<<min(x,4-x);
}
else
{
int tot=0;
for(int i=1;i<=n;i++) tot+=a[i];
if(n%2==1||tot%2==0) cout<<0;
else cout<<1;
}
cout<<'\n';
}
}
```