小奇画画

题目原址http://exam.upc.edu.cn/problem.php?cid=1390&pid=10

样例输入

4

7 5 -9 11 11 9 0 20

样例输出
6

题目大意:在无限大的平面上,给定圆心在x轴上的半径不一的圆,这些圆不想交,

但是可以相切,问这些圆将平面分成了几部分。

对于这些圆心在x轴上的圆,它们相切的切点也均在x轴上。对于一个圆只需判断从左端点到右端点是否可以通过

至少一个其他圆的端点到达,即可将圆分为两份。

好心的博友给我指出了错误,如果出现这种情况:

代码:

就会出现错误,下面这种代码是按左端点排序,使用到了类,不会出现上面的那种bug,又AC了的代码,经过了两次重判的

#include<bits/stdc++.h>
using namespace std;
struct Q
{
    int l,r;
    Q(){}
    Q(int _l,int _r):l(_l),r(_r){}
    bool operator < (const Q &o)const
    {
        return l<o.l||(l==o.l&&r>o.r);
    }
    bool operator == (const Q &o)const
    {
        return l==o.l&&r==o.r;
    }
}e[300300];
int cut,n;
Q dg(int x)
{
    if(x==n-1)return e[x];
    Q s=dg(x+1);
    if(e[x]==s||e[x].l==s.l&&e[x].r<s.r)
    {
        cut++;
        return s;
    }
    if(e[x].r==s.l)
    {
        return {e[x].l,s.r};
    }
    return e[x];
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        e[i]={a-b,a+b};
    }
 
    sort(e,e+n);
    dg(0);
    printf("%d\n",cut+1+n);
    return 0;
}

最后再感谢一次广大博友。同时也希望谁能告诉我为什么会出现这样的情况,我会万分感谢。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值