改了半天也改不明白这个二分查找(sad 太菜了,测试样例都是一半对一半错(
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m,k;cin>>n>>m>>k;
long long int mid,ans=0,maxn=0,second;
int times;
int a[n+1],b[m+1],c[k+1];
int chazhi,left,right;
for(int i=1;i<=n;i++){
cin>>a[i];
chazhi=a[i]-a[i-1];
if(chazhi==maxn) times++;//如果重复出现
if(maxn<chazhi){//找最大区间
second=maxn;
maxn=chazhi;
left=i-1;right=i;
mid=(a[i]+a[i-1])>>1;
times=0;//更换最大值,times清零
}
}
for(int i=1;i<=m;i++) cin>>b[i];
for(int i=1;i<=k;i++) cin>>c[i];
sort(b+1,b+m+1);sort(c+1,c+k+1);
int l,r,midd;int flag=0;//mid为找到的中间数,midd为二分搜索的中间数
for(int i=1;i<=m;i++){
l=1;r=k;midd=(l+r)>>1;
while(r-l>1){//二分
int numberr=b[i]+c[midd];
midd=(r+l)>>1;
if(numberr==mid){//如果直接查找到中间值,说明最大区间已经切成最小情况了
ans=mid;flag=1;break;
}//如果没找到中间值,继续二分查找
if(numberr>mid) r=midd;
else l=midd;
ans=max(max(mid-a[left],a[right]-mid),second);//答案只可能是第二大,找到的数和区间左边的数的差值,和区间右边的数差值三选一
}
if(flag==1) break;
}
if(times) cout<<maxn<<endl;
else cout<<ans<<endl;
}
int main(){
int t;cin>>t;
while(t--) solve();
}