一道大水题。
这道题,我们用贪心。
由题意知,前 n n n 项需改动的次数为 ∑ i = 1 n abs ( a i − b i ) \sum _ {i=1} ^ {n}\operatorname{abs}(a_{i}-b_{i}) ∑i=1nabs(ai−bi)。
所以我们要让最后一项改动的尽量小。
枚举每个 a i a_{i} ai 和 b i b_{i} bi,如果闭区间 [ a i , b i ] [ a_{i},b_{i} ] [ai,bi] 中包含了 b n + 1 b_{n+1} bn+1,则最后一项只需要复制(从 a i a_{i} ai 变成 b i b_{i} bi 时 a i = b n + 1 a_{i}=b_{n+1} ai=bn+1)。
否则最后一项要改动 min i = 1 n min ( abs ( a i − b n + 1 ) , abs ( b i − b n + 1 ) ) \min _ {i=1} ^ {n} \min( \operatorname{abs}(a_{i}-b_{n+1}),\operatorname{abs}(b_{i}-b_{n+1})) mini=1nmin(abs(ai−bn+1),abs(bi−bn+1)) 次。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+20;
int t,n,a[maxn],b[maxn];
void solve(){
cin>>n;
int x=1e18,y=0; // x为最后一项改动次数,y为前 n 项的差。
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n+1;i++) cin>>b[i];
for(int i=1;i<=n;i++){
if(min(a[i],b[i])<=b[n+1]&&max(a[i],b[i])>=b[n+1]){
x=0;
break;
}
x=min(x,min(abs(b[i]-b[n+1]),abs(a[i]-b[n+1])));
}
for(int i=1;i<=n;i++)
y+=abs(a[i]-b[i]);
cout<<x+y+1<<endl; // 还有一次复制!
}
signed main(){
cin>>t;
while(t--)
solve();
return 0;
}