zoukankan      html  css  js  c++  java
  • 天神下凡

                                                                               天神下凡
    时间限制: 3 Sec  内存限制: 256 M

    题目描述

    Czy找到宝藏获得屠龙宝刀和神秘秘籍!现在他要去找经常ntr他的Jmars报仇……

    Czy学会了一招“堕天一击”,他对一个地点发动堕天一击,地面上就会留下一个很大的圆坑。圆坑的周围一圈能量太过庞大,因此无法通过。所以每次czy发动技能都会把地面分割。Jmars拥有好大好大的土地,几十眼都望不到头,所以可以假设土地的大小是无限大。现在czy对他发动了猛烈的攻击,他想知道在泽宇攻击之后他的土地被切成几份了?

    Czy毕竟很虚,因此圆心都在x坐标轴上。另外,保证所有圆两两之间不会相交。

    输入

    输入第一行为整数n,表示czy放了n次堕天一击。

    接下来n行,每行两个整数x[i],r[i]。表示在坐标(x[i] , 0)放了一次堕天一击,半径为r[i]。

    输出

    输出一行,表示地面被分割成几块。

    样例输入

    47 5-9 1111 90 20

    样例输出

    6
              各种做法,可以离散后用线段树,可以用扫描线。。然而我都不会,我只会乱搞。。
               考试的时候不好好审题,圆之间不会相交,所以方便多了。
              因为几个圆可以把一个大圆分成两个,乱搞一下就行,巨简单
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #define N 300000 
    #include<algorithm>
    using namespace std;
    int n,ans=0,cnt,p;
    int read()
    {
        int sum=0,f=1;char x=getchar();
        while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}
        while(x>='0'&&x<='9')sum=sum*10+x-'0',x=getchar();
        return sum*f;
    }
    struct node
    {
        int l,r,h;
    } a[N+5];
    int cmp(const node a,const node b)
    {
        if(a.l==b.l)
           return a.r>b.r;
        return a.l<b.l;
    }
    void check(int x)
    {
        int k=a[x].l;
        for(int i=x+1;i<=n;i++)
        {
             if(a[i].l==k)
                 k=a[i].r;
             else
                 return;
             if(k==a[x].r)
             {
                 ans++;
                 return;
             }
             if(a[i].l>=a[x].r)return;
        }
    }
    int main()
    {
        //freopen("god.in","r",stdin);
        //freopen("god.out","w",stdout);
        n=read();
        int x,r;ans=n+1;
        for(int i=1;i<=n;i++)
        {
            x=read();r=read();
            a[i].l=x-r,a[i].r=x+r;a[i].h=x;
            if(!cnt)cnt=x;
            if(cnt!=x){
                p=1;
            }
        }
        if(!p)
        {
            printf("%d",n+1);
            exit(0);
        }
        sort(a+1,a+n+1,cmp);
        //for(int i=1;i<=n;i++)cout<<a[i].l<<" "<<a[i].r<<endl;
        for(int i=1;i<=n;i++)
        {
            check(i);
        }
        printf("%d",ans);
    }


  • 相关阅读:
    【转载】C#中List集合使用Contains方法判断是否包含某个对象
    【转载】C#中List集合使用Clear方法清空集合
    【转载】C#中List集合使用AddRange方法将一个集合加入到指定集合末尾
    【转载】C#中List集合使用Min()方法查找到最小值
    【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序
    Mysql,ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
    Android -- MeasureSpec
    Android -- PullToRefresh应用
    Android -- Gradle
    Android -- ShortCut
  • 原文地址:https://www.cnblogs.com/QTY2001/p/7632767.html
Copyright © 2011-2022 走看看