hdu3511 圆的扫描线

http://blog.csdn.net/firenet1/article/details/47041145

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <cstdio>
#include <set>
using namespace std;
const int maxn=500100;
struct Circle
{
    int id,x,y,r;
    Circle(int cid=0,int cx=0,int cy=0,int cr=0)
    {
         id=cid; x=cx; y=cy; r=cr;
    }
}cir[maxn],P[maxn];

bool cmp(Circle a, Circle b)
{
    return a.x<b.x;
}
int globalx;
struct point{
  int id,ty;
  point(int cid=0, int cty=0){
      id=cid;
      ty=cty;
  }
};
double yposition(int id, int ty)
{
    double x=globalx-cir[id].x;
    double y=sqrt(1.0*cir[id].r*cir[id].r-x*x);
    if(ty==1)return cir[id].y+y;
    return cir[id].y-y;
}
bool operator <(point a, point b)
{
     if(a.id==b.id)return a.ty>b.ty;
     return yposition(a.id,a.ty)>yposition(b.id,b.ty);
}
bool operator == (point a, point b)
{
     return a.id==b.id&&a.ty==b.ty;
}

set<point>Q;
int dep[maxn];
int main()
{
   int n;
    while(scanf("%d",&n)==1)
        {
            Q.clear();
             int cnt=0;
             for(int i=0; i<n; i++)
                {
                     scanf("%d%d%d",&cir[i].x,&cir[i].y, &cir[i].r);
                     cir[i].id=i;
                     P[cnt++]=Circle(i,cir[i].x-cir[i].r,0);
                     P[cnt++]=Circle(i,cir[i].x+cir[i].r,1);
                }
                sort(P,P+cnt,cmp);
               memset(dep,0,sizeof(dep));
               set<point>:: iterator it1,it2;
               int ans=0;
               for(int i=0; i<cnt; i++)
                {
                    globalx=P[i].x;
                     if(P[i].y==1)
                        {
                             Q.erase(point(P[i].id,0));
                             Q.erase(point(P[i].id,1));
                        }else
                        {
                            it1=Q.insert(point(P[i].id,1)).first;
                            it2=it1;
                            it1++;
                            if(it1==Q.end()||it2==Q.begin()){
                                dep[ P[i].id] =1;
                            }else
                            {
                                 it2--;
                                 if(it1->id==it2->id){
                                    dep[P[i].id]=dep[it1->id]+1;
                                 }else
                                 {
                                    dep[P[i].id]=max(dep[it1->id],dep[it2->id]);
                                 }
                            }

                            Q.insert(point(P[i].id,0));

                        }
                        ans=max(dep[P[i].id],ans);
                }
                printf("%d\n",ans);
        }
    return 0;
}

时间: 2024-11-05 00:42:25

hdu3511 圆的扫描线的相关文章

[北京集训测试赛(五)/HDU5299]圆圈游戏(Circles game)-树上删边-圆的扫描线

Problem 遗产 题目大意 一个平面上n个圆,任两个圆只会相离或包含,给出每个圆位置与半径. alice&&bob轮流取圆,每取一个就可以取出这个圆以及被这个圆包含的圆. 没圆取的人输,alice先取,问谁有必胜策略. Solution Method #1 首先我们考虑一个暴力一点的写法: 先将圆半径从小到大排序,然后枚举两个圆,判断是否包含关系. 如果包含的话就将大圆连一条边到小圆. 很容易发现,这样执行完以后得到了一棵树. 我们接下来要做的事情就变成了: 每个人可以轮流从树上删除一

POJ - 1981 :Circle and Points (圆的扫描线) hihocoder1508

题意:给定N个点,然后给定一个半径为R的圆,问这个圆最多覆盖多少个点. 思路:在圆弧上求扫描线. hihocoder1508的代码. #include<bits/stdc++.h> #define pdd pair<double,int> #define f first #define s second #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=200010; co

POJ 2932 Coneology (平面扫描)

Coneology Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3713   Accepted: 720 Description A student named Round Square loved to play with cones. He would arrange cones with different base radii arbitrarily on the floor and would admire

与平面和空间打交道的计算几何

计算几何基础 Jack Straws(POJ 1127) 原题如下: Jack Straws Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5494 Accepted: 2504 Description In the game of Jack Straws, a number of plastic or wooden "straws" are dumped on the table and players try

hdu 3511 Prison Break

http://acm.hdu.edu.cn/showproblem.php?pid=3511 题意: 给出n个相离或包含的圆,问最里层的圆是第几层 竖着的扫描线与圆在最左侧相切时 1.线在圆的上方或下方无交点,则该圆在第1层 2.线在圆的上下方都有交点,且上下方的交点属于同一个圆C,则该圆在圆C的里面一层 3.线在圆的上下方都有交点,上方交于圆E,下方交于圆F,EF其中一个在另一个里面,则该圆与在里面的那个圆处在同一层 4.线在圆的上下方都有交点,上方交于圆E,下方交于圆F,EF在同一层,则该圆

【BZOJ4561】[JLoi2016]圆的异或并 扫描线

[BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的圆.保证|x|,|y|,≤10^8,r>0,N<=200000 Output 仅一行一个整数,表示所有圆的

POJ 3549 GSM phone(圆+扫描线+最短路)

题目意思是求起点s到终点s的最短路,但是只能在圆的内部和边上走.一种可以想到的方法就是求出所有的交点,然后两两连边并验证合法性,但是这样的交点数规模有n2. 我们可以观察发现,我们在圆求并构成的图形中,在其内部的点是不可能成为最短路上的点,只可能是沿着边上的点擦着经过,所以我们需要把在圆内部的所有点都给扣掉,同样可以证明这样的点的规模只有n个,接下来只需要暴力连边,但是连边的时候需要验证这样的点对是否沿着直线可达.我是直接将这条线段暴力和所有圆求交点,左侧端点计为1,右侧端点计为-1,然后用类似

计数方法(扫描线):JLOI 2016 圆的异或并

Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的 圆.保证|x|,|y|,≤10^8,r>0,N<=200000 Output 仅一行一个整数,表示所有圆的异或面积并除以圆周率Pi的结果. Sample

【BZOJ-4561】圆的异或并 set + 扫描线

4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 254  Solved: 118[Submit][Status][Discuss] Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,