AIM Tech Round (Div. 1) C. Electric Charges 二分

C. Electric Charges

题目连接:

http://www.codeforces.com/contest/623/problem/C

Description

Programmer Sasha is a student at MIPT (Moscow Institute of Physics and Technology) and he needs to make a laboratory work to pass his finals.

A laboratory unit is a plane with standard coordinate axes marked on it. Physicists from Moscow Institute of Physics and Technology charged the axes by large electric charges: axis X is positive and axis Y is negative.

Experienced laboratory worker marked n points with integer coordinates (xi, yi) on the plane and stopped the time. Sasha should use "atomic tweezers" to place elementary particles in these points. He has an unlimited number of electrons (negatively charged elementary particles) and protons (positively charged elementary particles). He can put either an electron or a proton at each marked point. As soon as all marked points are filled with particles, laboratory worker will turn on the time again and the particles will come in motion and after some time they will stabilize in equilibrium. The objective of the laboratory work is to arrange the particles in such a way, that the diameter of the resulting state (the maximum distance between the pairs of points of the set) is as small as possible.

Since Sasha is a programmer, he naively thinks that all the particles will simply "fall" into their projections on the corresponding axes: electrons will fall on axis X, while protons will fall on axis Y. As we are programmers too, we will consider the same model as Sasha. That is, a particle gets from point (x, y) to point (x, 0) if it is an electron and to point (0, y) if it is a proton.

As the laboratory has high background radiation and Sasha takes care of his laptop, he did not take it with him, and now he can't write a program that computes the minimum possible diameter of the resulting set. Therefore, you will have to do it for him.

Print a square of the minimum possible diameter of the set.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of points marked on the plane.

Each of the next n lines contains two integers xi and yi ( - 108 ≤ xi, yi ≤ 108) — the coordinates of the i-th point. It is guaranteed that no two points coincide.

Output

Print a single integer — the square of the minimum possible diameter of the set.

Sample Input

3
1 10
1 20
1 30

Sample Output

0

Hint

题意

平面上有n个点,坐标为(xi,yi)

然后每个点可以变成(xi,0)或者(0,yi)

都这样变换之后,问你最小的两点最大距离的平方是多少呢?

题解:

首先考虑全部扔到一维的情况,答案为min(sq(xmax-xmin),sq(ymax-ymin))sq为平方的意思。

然后我们再考虑x轴和y轴都有电子的情况

这种情况的距离最大值,显然是sq(max(abs(x)))+sq(max(abs(y)))

我们首先二分答案,然后暴力枚举放在x轴的区间的左端点,右端点显然是x轴哪些不影响答案的点

然后剩下的点都在y轴上,然后看看是否够

然后再暴力枚举右端点

然后这样就完了,这道题……

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
long long lmin[maxn],rmin[maxn];
long long lmax[maxn],rmax[maxn];
pair<long long,long long>a[maxn];
int n;
long long sq(long long x)
{
    return x*x;
}
bool check(long long mid)
{
    int r = 1;
    for(int l=1;l<=n;l++)
    {
        if(a[l].first>0) break;
        while(r<n && sq(a[r+1].first-a[l].first)<=mid && abs(a[r+1].first)<=abs(a[l].first)) r++;
        while(abs(a[r].first)>abs(a[l].first)) r--;
        long long low = min(lmin[l-1],rmin[r+1]);
        long long high = max(lmax[l-1],rmax[r+1]);
        if (sq(high-low)<=mid && sq(max(abs(low),abs(high)))+sq(max(abs(a[l].first),abs(a[r].first)))<=mid) return true;
    }
    int l = n;
    for(int r=n;r>=1;r--)
    {
        if(a[r].first<0) break;
        while(l>1 && sq(a[l-1].first-a[r].first)<=mid && abs(a[l-1].first)<=abs(a[r].first)) l--;
        while(abs(a[l].first)>abs(a[r].first)) l++;
        long long low = min(lmin[l-1],rmin[r+1]);
        long long high = max(lmax[l-1],rmax[r+1]);
        if (sq(high-low)<=mid && sq(max(abs(low),abs(high)))+sq(max(abs(a[l].first),abs(a[r].first)))<=mid) return true;
    }
    return false;
}
long long xmin,xmax,ymin,ymax;
int main()
{
    xmin=ymin=1e16,xmax=ymax=-1e16;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&a[i].first,&a[i].second);
        xmin=min(xmin,a[i].first);
        xmax=max(xmax,a[i].first);
        ymin=min(ymin,a[i].second);
        ymax=max(ymax,a[i].second);
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
    {
        lmin[i]=min(a[i].second,lmin[i-1]);
        lmax[i]=max(a[i].second,lmax[i-1]);
    }
    for(int i=n;i>=1;i--)
    {
        rmin[i]=min(a[i].second,rmin[i+1]);
        rmax[i]=max(a[i].second,rmax[i+1]);
    }
    long long l = -1,r = min(sq(xmax-xmin),sq(ymax-ymin)),ans = r;
    while(l<=r)
    {
        long long mid = (l+r)/2;
        if(check(mid))ans = mid,r = mid-1;
        else l = mid+1;
    }
    printf("%lld\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值