bzoj1043: [HAOI2008]下落的圆盘
2016-03-03 10:02
309 查看
这道题题目很短,看一下数据范围n<1000,直接枚举圆盘。
对于圆盘i,枚举它上面的圆盘,计算圆盘i被它们覆盖的弧的起始位置与终止位置,然后线段覆盖可得圆盘i被覆盖的周长,就可得答案。
注意圆外离与内含的情况。
对于圆盘i,枚举它上面的圆盘,计算圆盘i被它们覆盖的弧的起始位置与终止位置,然后线段覆盖可得圆盘i被覆盖的周长,就可得答案。
注意圆外离与内含的情况。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #define pi 3.1415926535897932384626433832795 using namespace std; struct circle{double r,x,y;}a[10000]; struct arc{double a,b;}q[10000]; int n,le;double Ans; double di(circle a,circle b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double ang(double R,double d,double r) { return acos((R*R+d*d-r*r)/(2*R*d)); } bool cmp(arc a,arc b) { if (a.a==b.a)return a.b<b.b; else return a.a<b.a; } void add(double l,double r) { q[++le].a=l,q[le].b=r; } int main() { freopen("disc.in","r",stdin); freopen("disc.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lf%lf%lf",&a[i].r,&a[i].x,&a[i].y); for (int i=1;i<=n;i++) { bool f=0;le=0; for (int j=i+1;j<=n;j++) { double dis=di(a[i],a[j]); if (dis<=a[j].r-a[i].r) {f=1;break;} if (dis>=a[i].r+a[j].r||dis<=a[i].r-a[j].r) continue; double x=a[j].x-a[i].x,y=a[j].y-a[i].y; double a1=atan2(x,y)+pi; double a2=ang(a[i].r,dis,a[j].r); if (a1-a2<0) add(0,a1+a2), add(a1-a2+2*pi,2*pi);else if (a1+a2>2*pi) add(a1-a2,pi*2),add(0,a1+a2-2*pi); else add(a1-a2,a1+a2); } if (f==1)continue; sort(q+1,q+le+1,cmp); double l=-1,r=-1,sum=0; for (int j=1;j<=le;j++) if (q[j].a<=r) r=max(r,q[j].b); else { sum+=r-l; l=q[j].a; r=q[j].b; } sum+=r-l; Ans+=(2*pi-sum)*a[i].r; } printf("%.3f\n",Ans); return 0; }
相关文章推荐
- PHP将字符串首字母大小写转换
- Lua Development Tools (LDT)
- .Net Discovery系列之三 深入理解.Net垃圾收集机制(上)
- 《从零开始学Swift》学习笔记(Day 37)——默认构造函数
- C#隐藏主窗口的方法小结
- Qt 5.3.0 与 Qwt插件不兼容问题解决办法
- android广播接收者 ip电话拔号器
- Git仓库的使用
- JVM 基础知识(GC)
- 出现( linker command failed with exit code 1)错误总结
- 怎样查看mysql pid文件路径 文件位置
- JSON格式化输出
- 263. Ugly Number
- 2089杭电
- mac 连接远程服务器、上传文件
- windows群集--NLB--故障转移群集区别
- CentOS6.4(64位系统下安装jdk)
- 平衡树的理解笔记
- 直方图匹配
- python pip 安装模块报错