题目地址:https://vjudge.net/problem/UVALive-2572

离散化:把每个圆看成是一段一段弧组成的

每个圆拿出来看一下,先求其上与其他所有圆的交点。每两个交点之间的那段弧要么可见要么不可见,在弧上任取一个点(这里取的的中点),将该点向内(圆心方向)和向外移动一个微小的eps距离,为p1,p2,看看p1和p2是否在最上层的圆内,如果在内部,那么该圆可见

#include <bits/stdc++.h>
using namespace std;
const int maxn=100+5;
const double PI=acos(-1);
const double EPS=1e-13;
#define REP(i,a,b)  for(int i=a;i<=(int)(b);++i)
#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)
int dcmp(double x){if(x>EPS) return 1;else if(x<-EPS) return -1;else return 0;
}
struct Point{double x,y;Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Vector operator + (Vector A, Vector B) { return Vector(A.x+B.x, A.y+B.y); }
Vector operator - (Vector A, Vector B) { return Vector(A.x-B.x, A.y-B.y); }
Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }
Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }
double Angle(Vector v) { return atan2(v.y,v.x); }
double Length(Vector v) { return sqrt(v.x*v.x+v.y*v.y); }
double NormalizeAngle(double a){   //把(-180,180] 转化为 [0,360)return fmod(a+2*PI,2*PI);
}
void getCircleCircleIntersection(Point C1, double r1, Point C2, double r2,vector<double>& sol){double d = Length(C1-C2);if(dcmp(d)==0) return;if(dcmp(r1+r2-d)<0) return;if(dcmp(fabs(r1-r2)-d>0)) return; //内含,相离double ang=Angle(C2-C1);double dang=acos((r1*r1+d*d-r2*r2)/2/r1/d);sol.push_back(NormalizeAngle(ang+dang));if(dcmp(dang)!=0) sol.push_back(NormalizeAngle(ang-dang));
}Point C[maxn*2];
double RC[maxn];
int n;
bool vis[maxn];
vector<double> rad;inline Point point(Point p,double ang,double r){return Point(p.x+r*cos(ang),p.y+r*sin(ang));
}
void UpdateTop(Point p){REPD(i,n,1){double dist=Length(p-C[i]);if(dcmp(dist-RC[i])<0) { vis[i]=true; break; }}
}
int main(int argc, char const *argv[])
{// freopen("input.in","r",stdin);while(scanf("%d",&n)==1&&n){REP(i,1,n){double x,y,r;scanf("%lf%lf%lf",&x,&y,&r);C[i]=Point(x,y); RC[i]=r;}memset(vis,false,sizeof(vis));REP(i,1,n){rad.clear();rad.push_back(0);rad.push_back(2*PI);REP(j,1,n) {if(j==i) continue;getCircleCircleIntersection(C[i],RC[i],C[j],RC[j],rad);}sort(rad.begin(), rad.end());vector<double>::iterator it=unique(rad.begin(), rad.end());rad.erase(it,rad.end());REP(k,0,rad.size()-2){for(int side=-1;side<=1;side+=2){double nr=RC[i]+side*EPS*2;UpdateTop(point(C[i],(rad[k]+rad[k+1])/2,nr));}}}int cnt=0;REP(i,1,n) if(vis[i]) cnt++;printf("%d\n", cnt);}return 0;
}

LA 2572 Viva Confetti 离散化 *相关推荐

  1. LA 2572 Viva Confetti (Geometry.Circle)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=problem_st ...

  2. Viva Confetti UVALive - 2572

    Viva Confetti UVALive - 2572 **离散化的思想,将每一个圆都分成一个个小圆弧 const int maxn = 100+10; Point center[maxn]; do ...

  3. ZOJ 1696 Viva Confetti 计算几何

    计算几何:按顺序给n个圆覆盖.问最后能够有几个圆被看见.. . 对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这 ...

  4. POJ 1418 Viva Confetti 题解 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 1418 Viva Confetti礼花:Confetti 是一些大小不一的彩色圆形纸片,人们在派对上.过节时便抛洒它们以示庆 ...

  5. [POJ1418]Viva Confetti

    题目大意 按照从底至顶的顺序给出平面上的 n n个圆(xi,yi,ri)(x_i,y_i,r_i),求从最顶上看能看到多少个圆. 一个测试点多组数据. 1≤n≤100,|xi|,|yi|∈[−10,1 ...

  6. POJ 1418 Viva Confetti(Japan 2002 Kanazawa)

    点击打开链接 算法竞赛入门经典--训练指南 题目大意:n个圆盘依次放在桌面上,给出每个圆盘的坐标和圆心,求能看见的圆的个数; 分析:圆的每个可见部分由小圆弧围成,因此可以先求出所有小圆弧,然后判断每段 ...

  7. Viva Confetti UVA - 1308

    思路:由于圆与圆相交的可见部分都是有圆弧组成的,枚举一个圆与其他圆的交点,对两交点所形成的圆弧,去判断该圆弧的中间点是否在其他圆内.若都不在,则证明该圆没有被完全遮住. #include <cs ...

  8. php closure($this),PHP 中的Closure

    PHP 中的Closure Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函数的定义了. ...

  9. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

最新文章

  1. 用C++实现约瑟夫环的问题
  2. 导致SEO优化排名不理想的三大因素,你踩雷了没?
  3. 以太坊和区块链实战技术分析详解
  4. Django框架(16.Django中的模型类管理器以及自定义管理器)
  5. maven的日志在哪里看_日志管理领域研究现状(2)
  6. 体验.NET Core使用IKVM对接Java
  7. html5 网络断开,html5 – websocket不断断开连接
  8. java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion
  9. Linux下启动/关闭Oracle服务和 oracle监听启动/关闭/查看状态
  10. dom4j解析xml的简单实用
  11. 2021-2022-1 线性代数知识点总结
  12. Java-Swing编程介绍
  13. 随机数生成方法总计(附代码
  14. 拜尔滤色拜尔滤色镜_如何在iPhone或iPad上启用滤色器以方便眼睛阅读
  15. 网络安全kali渗透学习 web渗透入门 使用msf扫描靶机上mysql服务的空密码
  16. 微信小程序input禁止输入特殊表情符号与空格
  17. 【风马一族_mysql】mysql基本指令
  18. SQL Server的密码忘了怎么设置新密码
  19. 关于TTS SpeechVoiceSpeakFlags几个值的中文意思?
  20. P_sensor 距离感应器 阈值如何设置

热门文章

  1. VC6.0功能之-生成excel文件
  2. Linux内核之进程1:进程的概念
  3. java printwriter实例_Java PrintWriter 类
  4. 贝佐斯:管理亚马逊的20条经营理念
  5. 【计算理论与算法分析设计】 2. 输水管道问题
  6. 汇编实验:DEBUG命令调试
  7. 基于SSM甜品店销售管理系统
  8. CCD/CMOS传感器基本定义与镜头转换系数计算
  9. 【路径规划】基于matlab GUI粒子群算法机器人避障路径规划(手动设障)【含Matlab源码 924期】
  10. axel提示重定向太多