P3051题解
题目链接
这道题是思维+数学题,实现起来其实很简单.
我们先假设X[i]为i移到i+1的泥土数量. 我们因此可以得到以下式子:
然后我们从第一个土堆开始,注意土堆围成了一个环:
我们转换一下变为:
我们再枚举第二个:
我们可以把x[1]代入:
依次类推,我们列出通项:
令C[i] = B[i]-A[i],则通项转换为:
我们维护C[i]的前缀和S[i]表示C[1]~C[i]的和,我们就可以把式子转化为:
我们发现这些式子构成了一个绝对值不等式,而对于一个绝对值不等式当x[n]为S序列的中位数时和最小,这样x序列的和也就最小.
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,a[N],b[N],c[N],ans,mid;
signed main(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i]>>b[i];for(int i=1;i<=n;i++) c[i]=c[i-1]+a[i]-b[i];sort(c+1,c+n+1), mid=c[n/2+1];for(int i=1;i<=n;i++) ans+=abs(mid-c[i]);cout<<ans;return 0;
}