Codeforces Round 973 (Div. 2)
ABC 略
D
如果存在a[i]>a[j],i<j那么一定可以通过操使得a[i]和a[j]的差距变小,我们最后可以构造出一个单调不递减数列,那么答案就是a[n]-a[1],由于序列的和是固定的,那么当最小值取最大时,从1~n-1,a[i]<a[1]时,差的值从前面移的值补,a[i]>a[1]多的值可以作为补后面的值,最后剩下补给a[n]的值是最小的,可见a[1]q取最小值最大时a[n]可取的理论最大值最小。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int T,n,a[N],l,r,minx,maxn;
void init()
{
}
bool check(int x)
{int val=0;for(int i=1;i<=n;i++){if(a[i]>x) val+=a[i]-x;if(a[i]<x){if(val<x-a[i]) return false;val-=x-a[i];}}return true;
}
bool check2(int x)
{int val=0;for(int i=1;i<=n;i++){if(a[i]>x) val+=a[i]-x;if(a[i]<x){val-=x-a[i];val=max(val,(int)0);}}if(val) return false;return true;
}
void solve()
{cin>>n;init();for(int i=1;i<=n;i++)cin>>a[i];l=1,r=a[1];while(l<=r){int mid=(l+r)/2;if(check(mid)) {minx=mid;l=mid+1;}else r=mid-1;}l=1,r=1e12;while(l<=r){int mid=(l+r)/2;if(check2(mid)) {maxn=mid;r=mid-1;}else l=mid+1;}cout<<maxn-minx<<endl;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cin.tie(0);cout.tie();cin>>T;while(T--) solve();
}