POJ 2932 圆扫描线
求n个圆中没有被包含的圆。模仿扫描线从左往右扫,到左边界此时如有3个交点,则有3种情况,以此判定该圆是否被离它最近的圆包含,而交点和最近的圆可以用以y高度排序的Set来维护。因此每次到左边界插入该圆,找该圆最近的两个圆(上方和下方)判断是否包含,到右边界则从Set中删除该圆。
/** @Date : 2017-08-13 17:27:55* @FileName: POJ 2932 圆扫描线.cpp* @Platform: Windows* @Author : Lweleth (SoungEarlf@gmail.com)* @Link : https://github.com/* @Version : $Id$*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <utility>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <stack>
#include <queue>
#include <math.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;int n;
struct circle
{double x, y, r;circle(){}circle(double _x, double _y, double _r){x = _x, y = _y, r = _r;}
};circle c[N];
pair<double, int>p[N*2];
int ans[N];int isinside(int a, int b)
{double dx = c[a].x - c[b].x;double dy = c[a].y - c[b].y;return dx * dx + dy * dy <= c[b].r * c[b].r;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; i++){double x, y, r;scanf("%lf%lf%lf", &r, &x, &y);c[i] = circle(x, y, r);}for(int i = 0; i < n; i++){p[i*2] = MP(c[i].x - c[i].r, i);p[i*2 + 1] = MP(c[i].x + c[i].r, i + n);}sort(p, p + 2 * n);set<pair<double, int> >q;int cnt = 0;for(int i = 0; i < 2 * n; i++){if(p[i].se < n){set<pair<double, int> >::iterator it;/*auto */it = q.lower_bound(MP(c[p[i].se].y, p[i].se));if(it != q.end() && isinside(p[i].se, it->se)|| it != q.begin()&&isinside(p[i].se, (--it)->se))continue;q.insert(MP(c[p[i].se].y, p[i].se));ans[cnt++] = p[i].se;}else q.erase(MP(c[p[i].se%n].y, p[i].se%n)); }sort(ans, ans + cnt);printf("%d\n", cnt);for(int i = 0; i < cnt; i++)printf("%d%s", ans[i] + 1, i==cnt-1?"\n":" ");return 0;
}
转载于:https://www.cnblogs.com/Yumesenya/p/7688240.html
POJ 2932 圆扫描线相关推荐
- 20180513模拟赛
T1/Codeforces 975C 很简单,直接前缀和然后二分找答案即可,注意超过最大挡箭数的时候会"全员复活" ······ #include<bits/stdc++.h ...
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ 1177 Picture [离散化+扫描线+线段树]
http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...
- ybtoj洛谷P3268:圆的异或并(扫描线)
解析 很神奇的一道题. 关键条件:任意两个圆无交. 把一个圆分成上下两个圆弧,那么所有圆弧的高度关系不会发生变化. 所以可以开一个 set,维护一个从左往右扫的扫描线,按照当前扫描线的横坐标定义比较符 ...
- 扫描线三巨头 hdu1928hdu 1255 hdu 1542 [POJ 1151]
学习链接:http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想,后期可以求解很多问题. 扫描线求矩形周长并 hd ...
- 【HDU5299】Circles Game,圆的扫描线+树上删边游戏
传送门 思路: 两个板子的结合 如果会方法的话没什么难度 至于为什么要写这个博客呢? 只是拿来当板子用-- 圆的扫描线理解了好久,终于想出来是怎么一回事了 我觉得这种东西还是自己主动去思考的好,写的长 ...
- POJ 1151 Atlantis 矩形面积求交/线段树扫描线
Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...
- 【扫描线法】 poj 1177 hdu 1828
可以看看这里: http://www.cnblogs.com/Booble/archive/2010/10/10/1847163.html 为了写扫描线, 大概写了有史以来最丑的线段树了. poj 1 ...
最新文章
- 青蛙跳台(含变种)及汉诺塔递归,母牛生小牛
- 使用Spring WebFlux进行操作
- sql查询 关联帖子_MySQL的大分页查询该如何优化?
- 同样是卖票,为啥阿里卖电影票就不卡?技术上做了啥???
- 扑捉和捕捉的区别照相_扑捉和捕捉的区别照相
- android 动态规划,7. 动态规划(二)Android移动应用开发.pdf
- python打包exe
- VS2008+CUDA6.0 出现LINK:fatal error LINK1146:没用选项/LIBPATH指定的参数
- 计算机html二级难度,计算机二级考试越来越难的实锤!真实数据告诉你到底难在哪里?...
- 一致代价搜索_58搜索效率优化平台建设实践
- QGIS展示三维DEM数据
- 电脑变WIFI:建立虚拟共享WIFI热点可查看WIFI密码windows中使用bat批处理命令提示符cmd创建教程含工具
- 原始 NeRF(新视图重建的神经辐射场) 论文主要点细致介绍
- Nolanjdc对接傻妞教程
- MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁
- 计算机技术预测蛋白质结构,蛋白质结构预测:生命科学的又一场竞争
- python中主函数循环_python入门(三):分支、循环、函数详解
- .NET程序中加入Autodesk Design Review 2013 ,打包完成后安装提示未注册XXX.dll解决办法
- 【Unity VR开发】结合VRTK4.0:不可移动区域
- Apple Watch卡住在苹果标志界面,该怎么解决?