P6874 题解
定义一种情况的中间最低的柱子为底柱。
设答案的底柱高为
若有
证明:
设在一个位置上的目标高度是
当
-
-
-
否则总花费不变。
由于
证毕。
同理,若有 读者自证不难)
所以,给定一个高度,可以知道它在答案的左边还是右边,考虑二分答案解决。
复杂度
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll l,r,a[300009],b[300009],n;
ll abs_(ll x){return (x>=0?x:-x);}
ll chk(ll t){
ll ans=0;
for(ll i=0;i<n;i++)ans+=abs_(t-a[i]+abs_(n/2-i));
for(ll i=0;i<n;i++)ans+=abs_(t-b[i]+abs_(n/2-i));
return ans;
}
void print(ll t){printf("%lld\n",chk(t));return ;}
int main(){
scanf("%lld",&n);
for(ll i=0;i<n;i++)scanf("%lld",a+i);
for(ll i=0;i<n;i++)scanf("%lld",b+i);
l=0ll;r=1000000000001ll;
while(l<r){//二分
ll mid=(l+r)/2;
if(chk(mid+1)>chk(mid))r=mid;
else l=mid+1;
}
print(l);
return 0;
}