对于长度为 n 的序列 A,在其上反复使用平衡操作,直到得到单调不减的序列 B。由于 B 单调不减,显然有 \min(B)=B_1=L(B)=\lfloor L(B)\rfloor 以及 \max(B)=B_n=R(B)=\lceil R(B)\rceil。根据引理二,\lfloor L(B)\rfloor=\lfloor L(A)\rfloor 且 \lceil R(B)\rceil=\lceil R(A)\rceil,因此序列 B 的极差 \max(B)-\min(B)=\lceil R(A)\rceil-\lfloor L(A)\rfloor。
另一方面,根据引理一,无论在 A 上进行怎样的操作,最终得到的序列 C 一定满足 \max(C)-\min(C)\ge\lceil R(A)\rceil-\lfloor L(A)\rfloor,因此上述序列 B 已经达到了最优解,故最终答案为 \lceil R(A)\rceil-\lfloor L(A)\rfloor。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<ll> a(n);
for (auto& x : a)
cin >> x;
vector<ll> pre_avg(n), suf_avg(n);
pre_avg[0] = a[0];
for (int i = 1; i < n; i++)
pre_avg[i] = pre_avg[i - 1] + a[i];
for (int i = 0; i < n; i++)
pre_avg[i] /= i + 1;
suf_avg[n - 1] = a[n - 1];
for (int i = n - 2; i >= 0; i--)
suf_avg[i] = suf_avg[i + 1] + a[i];
for (int i = n - 1; i >= 0; i--)
suf_avg[i] = (suf_avg[i] + n - i - 1) / (n - i);
cout << *ranges::max_element(suf_avg) - *ranges::min_element(pre_avg) << '\n';
}
}