BZOJ传送门
洛谷传送门
解析:
短代码神题,环形的均摊纸牌。
其实很容易发现我们可以断环成链。
然而怎么断,链上维护前缀和,取一下中位数。
其实取中位数没有必要排序,直接nth_element找一下中位数就好了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
ll sum[1000006],tot;
signed main(){
int n;
scanf("%d",&n);
for(int re i=1;i<=n;++i)scanf("%lld",&sum[i]),tot+=sum[i];
tot/=n;
for(int re i=1;i<=n;++i)sum[i]-=tot;
for(int re i=1;i<=n;++i)sum[i]+=sum[i-1];
nth_element(sum+1,sum+((n+1)/2),sum+n+1);
tot=0;
for(int re i=1;i<=n;++i){
tot+=abs(sum[i]-sum[(n+1)>>1]);
}
cout<<tot;
return 0;
}