jzoj1792

时间:2021-01-15 21:02:46

#include<bits/stdc++.h>
using namespace std;
long long a[100010],m,n;
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    scanf("%lld",&m);
    while(m--){
        long long a1,b1,a2,b2;
        scanf("%lld%lld%lld%lld",&a1,&b1,&a2,&b2);
        if(a1>a2){
            swap(a1,a2);
            swap(b1,b2);
        }
        if((b1>0&&b2>0)||(b1<0&&b2<0))
            printf("%lld\n",abs(a1-a2)+abs(b1-b2));
        else{
            int v=upper_bound(a+1,a+n+1,(a1+a2)/2)-a;
            if(a[v]>=a1&&a[v]<=a2)
                printf("%lld\n",abs(a1-a2)+abs(b1-b2));
            else{
                if(v!=1&&v!=n+1)v--;
                int w=lower_bound(a+1,a+n+1,(a1+a2)/2)-a;
                int c1=abs(b1-b2)+abs(a[w]-a1)+abs(a[w]-a2);
                int c2=abs(b1-b2)+abs(a[w-1]-a1)+abs(a[w-1]-a2);
                int c3=abs(b1-b2)+abs(a[w+1]-a1)+abs(a[w+1]-a2);
                printf("%d\n",min(c1,min(c2,c3)));
            }
        }
    }
}

zj:

在答案有误差时,可以对多种可能的答案取最小值来确定结果

相关文章