U90400 2. 学习(二分答案) 50求解
  • 板块题目总版
  • 楼主孟海容
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/9/4 19:27
  • 上次更新2023/11/5 13:44:57
查看原帖
U90400 2. 学习(二分答案) 50求解
138293
孟海容楼主2020/9/4 19:27
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int t,n,m;
bool q,p;
long long p1,p2,p3,p4,ans1,ans2,ans3,ans4,a[100010],b[100010],c[100010],mid,l,r,aa,bb,cc,dd,ee,ff;
void search1(long long x){
	l=1,r=n;
	if(x<=a[1]) {
		mid=1;
		return ;}
	if(x>=a[n]) {
		mid=n;
		return;}
	while(l<=r){
		mid=(l+r)/2;
		if(x>a[mid]&&x<a[mid+1])
		return ;
		if(a[mid]==x){
			p=1;
			return;}
		if(x<a[mid]) r=mid;
		if(x>a[mid]) l=mid;}
}
void search2(long long x){
	l=1,r=m;
	if(x<=b[1]) {
		mid=1;
		return;}
	if(x>=b[m]) {
		mid=m;
		return;}
	while(l<=r){
		mid=(l+r)/2;
		if(x>b[mid]&&x<b[mid+1])
		return ;
		if(b[mid]==x){
			p=1;
			return;}
		if(x<b[mid]) r=mid;
		if(x>b[mid]) l=mid;}
}
long long hs(long long a,long long b,long long n){
	if(a==b) return abs(a-n);
	if(a>b&&b>n) return a-n;
	if(a>n&&n>b) return a-b+min(a-n,n-b);
	if(b>a&&a>n) return b-n;
	if(b>n&&n>a) return b-a+min(b-n,n-a);
	if(n>a&&a>b) return n-b;
	if(n>b&&b>a) return n-a;
}
int main(){
	
	scanf("%d%d%d",&n,&m,&t);
	for(int i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++)
	scanf("%lld",&b[i]);
	if(n==1&&m==1){
        long long cnta=a[1];
        long long cntb=b[1];
        for(int i=1; i<=t; i++) {
            long long x;
            cin>>x;
            long long ca=x-cnta;
            long long cb=x-cntb;
            if(ca==0||cb==0) {
                cout<<abs(ca+cb)<<endl;
            }
            if((ca>0&&cb>0)||(ca<0&&cb<0)) {
                cout<<max(abs(ca),abs(cb))<<endl;
            }
            if((ca>0&&cb<0)||(ca<0&&cb>0)) {
                cout<<abs(ca)+abs(cb)+min(abs(ca),abs(cb))<<endl;
            }
        }
        return 0;
	}
	sort(a+1,a+1+n);
	sort(b+1,b+1+m);
	for(int i=1;i<=t;i++)
	scanf("%lld",&c[i]);
	for(int i=1;i<=t;i++){
		p=q=0;
		search1(c[i]);
		if(p==1){
			search2(c[i]);
			if(q==1)
				printf("0\n");
			else printf("%lld\n",min(abs(c[i]-b[mid]),abs(c[i]-b[mid+1])));
			continue;
		}
		aa=mid,bb=mid+1;
		search2(a[aa]);
		cc=mid,dd=mid+1;
		search2(a[bb]);
		ee=mid,ff=mid+1;
		ans1=hs(a[aa],b[cc],c[i]);
		ans2=hs(a[aa],b[dd],c[i]);
		ans3=hs(a[bb],b[ee],c[i]);
		ans4=hs(a[bb],b[ff],c[i]);
		printf("%lld\n",min(min(ans1,ans2),min(ans3,ans4)));
	}
	return 0;
}
2020/9/4 19:27
加载中...