POJ 2932 (扫描线)
2015-11-30 13:08
281 查看
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <iostream> using namespace std; #define maxn 81111 #define pb push_back #define mp make_pair double x[maxn], y[maxn], r[maxn]; int n; bool in (int i, int j) { //判断圆i在不在圆j里面 double xx = x[i]-x[j], yy = y[i]-y[j]; return sqrt (xx*xx + yy*yy) + r[i] < r[j]; } int main () { //freopen ("in", "r", stdin); while (scanf ("%d", &n) == 1) { for (int i = 1; i <= n; i++) { scanf ("%lf%lf%lf", &r[i], &x[i], &y[i]); } vector <pair<double, int> > a; for (int i = 1; i <= n; i++) { a.pb (mp (x[i]-r[i], i)); a.pb (mp (x[i]+r[i], i+n)); } sort (a.begin (), a.end ()); set <pair<double, int> > gg; gg.clear (); vector <int> ans; ans.clear (); for (int i = 0; i < a.size (); i++) { int id = a[i].second; if (id <= n) { //左边界 set <pair<double, int> >:: iterator it = gg.lower_bound (mp (y[id], id)); if (it != gg.end () && in (id, it->second)) continue; if (it != gg.begin () && in (id, (--it)->second)) continue; ans.pb (id); gg.insert (mp (y[id], id)); } else { id -= n; gg.erase (mp (y[id], id)); } } sort (ans.begin (), ans.end ()); printf ("%d\n", ans.size ()); for (int i = 0; i < ans.size (); i++) { printf ("%d%c", ans[i], (i+1 == ans.size () ? '\n' : ' ')); } } return 0; }
相关文章推荐
- SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)
- Bmob文档阅读5-支付快速入门
- java中几种常用的设计模式
- Adivisor
- 成员函数指针 C++ FAQ LITE — Frequently Asked Questions
- 工业4.0时代,怎样为孩子筹备未来的教育
- Ubuntu系统 SLAM 操作环境搭建
- Failed to call ScheduleShutdown in logind, proceeding with immediate shutdown: Access denied
- Eigen库实现简单的旋转、平移操作
- 首篇博客
- 那些坑了我N多时间的问题(持续更新)
- 《统计学习方法》学习笔记(四)——朴素贝叶斯法
- cocoapods使用
- HDU 5587 Array
- JavaScript HTML DOM 元素(节点)
- Lintcode: Sqrt(X)
- Callback机制在Android中的应用场景
- mysql优化方案
- jsp中引入外部js文件时需要注意的关键点
- 数据结构基础7.6:表排序