51Nod1278 相离的圆

Posted sz-wcc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod1278 相离的圆相关的知识,希望对你有一定的参考价值。

Problem

平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。

例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么1, 2, 1, 3 2, 3 2, 4 3, 4这5对都有交点,只有1, 4是相离的。

Solution

注意圆心在坐标轴上,之前因为没看到这句话把题跳了。
然后就可以转化为线段,按照左端点排序,i代表线段循环,二分求左端点在第i条线段右端点左边的最后一个线段,他后面的线段就是相离的,加入答案。

Code

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define io_opt std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
int n,ans;
struct E
    int s,t;
e[50020];
int cmp(E x,E y)
    if(x.s==y.s) return x.t<y.t;
    return x.s<y.s;

int main()
    //io_opt;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        int x,r;
        scanf("%d%d",&x,&r);
        e[i].s=x-r;
        e[i].t=x+r;
    
    sort(e+1,e+1+n,cmp);
    for(int i=1;i<=n;i++)
        int l=i,r=n,mid,tmp=i;
        while(l<=r)
            mid=(l+r)>>1;
            if(e[mid].s<=e[i].t)
                l=mid+1;
                tmp=mid;
            
            else
                r=mid-1;
            
        
        ans+=n-tmp;
    
    printf("%d\n",ans);
    return 0;

以上是关于51Nod1278 相离的圆的主要内容,如果未能解决你的问题,请参考以下文章

51Nod1278 相离的圆

51NOD 1278 相离的圆(二分 + 排序)

51nod 1278 相离的圆 二分

想离的圆(排序+二分查找)

模板计几圆的反演

UVA10256 The Great Divide