找最深的圆,输出层数

类似POJ 2932的做法 圆扫描线即可。这里要记录各个圆的层数,所以多加一个维护编号的就行了。

/** @Date    : 2017-10-18 18:16:52
* @FileName: HDU 3511 圆扫描线.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; struct yuu
{
double x, y, r;
yuu(){}
yuu(double _x, double _y, double _r):x(_x), y(_y), r(_r){}
};
yuu a[N];
double scanx; struct cir
{
int m;
int flag;
cir(){}
cir(int _m, int _f):m(_m), flag(_f){}
bool operator <(const cir &b) const{
double dis1 = sqrt(a[m].r * a[m].r - (scanx - a[m].x) * (scanx - a[m].x));
double dis2 = sqrt(a[b.m].r * a[b.m].r - (scanx - a[b.m].x) * (scanx - a[b.m].x));
double y1 = a[m].y + dis1 * flag;
double y2 = a[b.m].y + dis2 * b.flag;
return y1 < y2|| (fabs(y1 - y2) < eps && flag < b.flag);
}
}; pair<double ,int> p[N*2]; int ans[N]; int main()
{
int n;
while(cin >> n)
{
MMF(ans);
for(int i = 0; i < n; i++)
{
double x, y, r;
scanf("%lf%lf%lf", &x, &y, &r);
a[i] = yuu(x, y, r);
p[i*2] = MP(x - r, i);
p[i*2 + 1] = MP(x + r, i + n);
}
sort(p, p + 2 * n);
set<cir>st;//按交点高度维护圆集合
int ma = 0;
for(int i = 0; i < 2 * n; i++)
{
scanx = p[i].fi;
if(p[i].se < n)
{
int up = -1, dw = -1;
st.insert(cir(p[i].se, -1));
auto pos = st.lower_bound(cir(p[i].se, -1));
if((++pos) != st.end())
up = (pos)->m;
if((--pos) != st.begin())
dw = (--pos)->m;
if(up == dw && ~up)
ans[p[i].se] = ans[up] + 1;
else if(~up && ~dw)
ans[p[i].se] = max(ans[up], ans[dw]);
else ans[p[i].se] = 1;
//cout << up << dw << endl;
st.insert(cir(p[i].se, 1));
ma = max(ma, ans[p[i].se]);
}
else
{
st.erase(cir(p[i].se%n, 1));
st.erase(cir(p[i].se%n, -1));
}
}
printf("%d\n", ma);
}
return 0;
}

HDU 3511 圆扫描线的更多相关文章

  1. POJ 2932 圆扫描线

    求n个圆中没有被包含的圆.模仿扫描线从左往右扫,到左边界此时如有3个交点,则有3种情况,以此判定该圆是否被离它最近的圆包含,而交点和最近的圆可以用以y高度排序的Set来维护.因此每次到左边界插入该圆, ...

  2. (中等) HDU 3265 Posters , 扫描线。

    Problem Description Ted has a new house with a huge window. In this big summer, Ted decides to decor ...

  3. hdu 3255 Farming(扫描线)

    题目链接:hdu 3255 Farming 题目大意:给定N个矩形,M个植物,然后给定每一个植物的权值pi,pi表示种植物i的土地,单位面积能够收获pi,每一个矩形给定左下角和右上角点的坐标,以及s, ...

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

    题目意思是求起点s到终点s的最短路,但是只能在圆的内部和边上走.一种可以想到的方法就是求出所有的交点,然后两两连边并验证合法性,但是这样的交点数规模有n2. 我们可以观察发现,我们在圆求并构成的图形中 ...

  5. POJ2932 Coneology【圆扫描线】

    POJ2932 Coneology 题意: 给出一些不相交的圆,问有多少个圆不被其他圆包围 题解: 扫描线,把所有圆的左边界和右边界放到\(vector\)里排序,遍历到圆左边界的时候判断是否满足条件 ...

  6. Atlantis HDU - 1542 (扫描线,线段树)

    扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...

  7. 覆盖的面积 HDU - 1255(扫描线求面积交)

    题意: 就是扫描线求面积交 解析: 参考求面积并.... 就是把down的判断条件改了一下..由w > 0 改为 w > 1 同时要讨论一下 == 1 时  的情况, 所以就要用到一个临时 ...

  8. hdu 3264 圆的交+二分

    Open-air shopping malls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  9. POJ 1151 HDU 1542 Atlantis(扫描线)

    题目大意就是:去一个地方探险,然后给你一些地图描写叙述这个地方,每一个描写叙述是一个矩形的右下角和左上角.地图有些地方是重叠的.所以让你求出被描写叙述的地方的总面积. 扫描线的第一道题,想了又想,啸爷 ...

随机推荐

  1. Jmeter(八)-发送JDBC请求

    下午花了两个小时研究了一下Jmeter发送JDBC请求,现在把基本操作流程分享一下. 做JDBC请求,首先需要两个jar包:mysql驱动-mysql-connector-java-5.1.13-bi ...

  2. js获取浏览器对象的信息

    js中有一个对象叫 navigator,navigator 对象包含有关浏览器的信息.所有的浏览器都支持该对象. 其中经常用到的是 navigator.userAgent 属性,通常,它是在 navi ...

  3. C#_IO操作

    1.创建文件夹 //using System.IO; Directory.CreateDirectory(%%1);   2.创建文件 //using System.IO; File.Create(% ...

  4. C语言 -- 字符串详解

    字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中.同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 ...

  5. 【zigbee 】2.4G信号发放器 AT2401C PA功放

    概述 AT2401C 是一款面向Zigbee,无线传感网络以及其他2.4GHz 频 段无线系统的全集成射频功能的射频前端单芯片.AT2401C 是采用 CMOS 工艺实现的单芯片器件,其内部集成了功率 ...

  6. 微软职位内部推荐-Senior Software Development Engineer_Commerce

    微软近期Open的职位: Are you looking for a high impact project that involves processing of billions of dolla ...

  7. 《Linux内核分析》第二周学习报告

    <Linux内核分析>第二周学习报告 ——操作系统是如何工作的 姓名:王玮怡  学号:20135116 第一节 函数调用堆栈 一.三个法宝 二.深入理解函数调用堆栈 三.参数传递与局部变量 ...

  8. 四种losses

    1. Classification losses 每次输入一个样本,对样本进行类别预测,根据预测类别和真实标签得到对应的分类损失. 2. Pairwise losses 每次输入两个样本,数据集包含了 ...

  9. C#程序解读

    阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...

  10. ElasticSearch5.6.1 + 中文分词(IK)

    在安装ElasticSearch 需要先安装java 的 jdk 可以通过  命令来确认是否已经安装了 java -version 如果没有安装可以使用 yum 直接安装通过. 先通过命令查看yum源 ...