POJ2932 扫描线
来源:互联网 发布:第三方软件测试报告 编辑:程序博客网 时间:2024/05/21 17:19
#include <cstdlib>#include <cstdio>#include <iostream>#include <vector>#include <set>#include <algorithm>using namespace std;double x[400005];double y[400005];double r[400005];int n;int inside(int i,int j){ double dx = x[i] - x[j]; double dy = y[i] - y[j]; return (dx*dx + dy*dy) <= r[j]*r[j];}void solve(){ vector<pair<double,int> > event; for(int i = 0;i < n;i++){ event.push_back(make_pair(x[i]-r[i],i)); event.push_back(make_pair(x[i]+r[i],i+n)); } sort(event.begin(),event.end()); set<pair<double,int> > se; vector<int> res; for(int i = 0;i < event.size();i++){ int id = event[i].second%n; if(event[i].second < n){ set<pair<double,int> >::iterator it = se.lower_bound(make_pair(y[id],id)); if(it != se.end() && inside(id,it->second)) continue; if(it != se.begin() && inside(id,(--it)->second)) continue; res.push_back(id); se.insert(make_pair(y[id],id)); } else{ se.erase(make_pair(y[id],id)); } } sort(res.begin(),res.end()); printf("%d\n",res.size()); for(int i = 0;i < res.size();i++){ printf("%d%c",res[i] + 1,(i+1)==res.size() ? '\n' : ' '); }}int main(){ while(scanf("%d",&n)!=EOF){ for(int i = 0;i < n;i++){ scanf("%lf%lf%lf",&r[i],&x[i],&y[i]); } solve(); } return 0;}
只判断se中的离当前点最近的两个原因是这个里面存放的是当前找到的没有被其他圆包含的的圆,如果有更外部的圆包含当前圆,那么这时候就会出现相交的情况。画个图就能知道了!
0 0
- POJ2932 扫描线
- 扫描线POJ2932
- poj2932(几何扫描线)
- poj2932:Coneology(扫描线)
- poj2932 Coneology【扫描线+set】
- POJ2932
- poj2932
- POJ2932
- POJ2932:Coneolog
- Coneology(poj2932)
- 扫描线
- 扫描线
- 扫描线
- 扫描线
- 扫描线
- 扫描线
- 多边形扫描线算法
- HDU 4007 线扫描
- 关于自定义UITableViewCell报错问题
- 使用matlab读取excel数据并保存
- Unity3d 游戏场景优化 第三章
- 【UIKit-54-1】UIInterface-系统的颜色与字体
- MySQL删除二进制日志
- POJ2932 扫描线
- Unity3d 游戏场景优化 第二章
- MAC OS真正提权,告别rootless
- leecode | Nim game
- DBN爬坑记之RBM
- MD5算法步骤详解
- 开始使用oracle12c之间
- C# WPF 读写Excel文件
- 字符串判等(奇葩水题)