POJ2932
2016-05-18 20:14
281 查看
此题切记不要从1开始记录每组数据,因为在取模那里很容易出错!!!还是回归到0吧,因为这个WA了好几次了!
#include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <set> #include <algorithm> using namespace std; double x[40005],y[40005],r[40005]; vector<int>res; int N; set<pair<double,int> >BaoLiu; set<pair<double,int> >::iterator it; pair<double,int> All[80010]; bool Judge(int i,int j) //此函数为包含判断 { if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])>r[j]*r[j]) { return false; } else return true; } void solve() { int i,j,id; j=0; for(i=0;i<N;i++) //保留左右边界 { All[j++]=make_pair(x[i]-r[i],i); All[j++]=make_pair(x[i]+r[i],i+N); } sort(All,All+2*N); //边界排序 for(i=0;i<2*N;i++) { id=All[i].second%N; if(All[i].second<N) //扫描到左边界 { it=BaoLiu.lower_bound(make_pair(y[id],id)); //实际上只用判断离该圆最近的两个圆是否包含该圆 if((it!=BaoLiu.end()&&Judge(id,it->second))||(it!=BaoLiu.begin()&&Judge(id,(--it)->second)))//判断是否被包含 continue; res.push_back(id); //未被包含则保存下来 BaoLiu.insert(make_pair(y[id],id)); //保留到与扫描线相交并且不被其他圆包含的圆的集合中 } else BaoLiu.erase(make_pair(y[id],id)); //扫描到右边界直接把圆从集合中删除就可以,提高效率 } } int main() { int i; scanf("%d",&N); for(i=0;i<N;i++) { scanf("%lf%lf%lf",&r[i],&x[i],&y[i]); } solve(); sort(res.begin(),res.end()); //序号的排序 printf("%d\n",res.size()); printf("%d",res[0]+1); //序号记得加1,因为题目中是从1开始计序号的 for(i=1;i<res.size();i++) { printf(" %d",res[i]+1); } return 0; }
相关文章推荐
- 逆元的学习
- 2016.03.13培训日记
- leetcode 66_Plus One C++
- iOS SDWebImage源代码分析(上)
- bzoj 4530: [Bjoi2014]大融合
- Bridging Qemu Image To Real Network Using Tap Interface
- Java程序内存分析:使用mat工具分析内存占用
- Linux 开机启动软件配置和环境变量配置
- bzoj4592: [Shoi2015]脑洞治疗仪
- linux shell script脚本判断mysql是否正常启动
- VMware Workstation装windowsXP与主机形成局域网
- 慕课网二次学习(一)
- 自定义了一个view 但是无法响应事件
- 12563 - Jin Ge Jin Qu hao——[DP递推]
- 活动的最佳实践之 如何知晓当前是在哪个活动 --16
- C语言求最小公倍数和最大公约数三种算法
- 动态规划解决0/1背包问题
- Eclipse Memory Analyzer 使用技巧
- bzoj 3211 花神游历各国
- 学习SpringMVC(十)之确定目标方法POJO类型参数