问题描述

LG2512

BZOJ1045


题解

这是一个链状问题的环状版本。

问题最终变为给定数轴上的\(n\)个点,找出一个到他们的距离之和尽量小的点,而这个点就是这些数中的中位数。

网络流24题的负载平衡问题是双倍经验


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-'){
        fh=-1;ch=getchar();
    }
    else fh=1;
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    x*=fh;
}

#define int long long

const int maxn=1000000+7;
int n,a[maxn],s[maxn];
int ans,sum;
signed main(){
    read(n);
    for(int i=1;i<=n;i++) read(a[i]),sum+=a[i];
    sum/=n;
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-sum;
    sort(s+1,s+n+1);
    for(int i=1;i<=n;i++) ans=ans+(abs(s[n/2+1]-s[i]));
    printf("%lld\n",ans);
    return 0;
}