CF1976B 题解
题目传送门
思路
对序列
那么我们该如何确定
-
如果
a_i 累加或者累减的时候恰好是b_{n+1} ,那么这个代价就是0 。 -
否则只能取与与
b_{n+1} 差值最小的值作为代价。
但是答案并不是上述所求的和,因为将
AC CODE
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int t,n,x,a[N],b[N];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
long long ans=0;
for(int i=1;i<=n;++i){
scanf("%d",&b[i]);
if(a[i]>b[i])//为了方便计算,我们让a[i]<=b[i]
swap(a[i],b[i]);
ans+=b[i]-a[i];//计算a[i]与b[i]的绝对值
}
scanf("%d",&x);//即b[n+1]
int temp=0x7FFFFFFF;
for(int i=1;i<=n;++i){
if(a[i]<=x&&x<=b[i]){//说明b[n+1]再a[i]与b[i]之间
temp=0;//所以代价为0
break;
}
temp=min(temp,int(min(abs(a[i]-x),abs(b[i]-x))));
//否则只能取与与b[n+1]差值最小的值作为代价
}
printf("%lld\n",ans+temp+1);
//注意复制也需要大小为1的代价,所以最终答案上要+1
}
return 0;
}