【BZOJ 2823】 [AHOI2012]信号塔
2015-04-03 22:28
260 查看
2823: [AHOI2012]信号塔
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 469 Solved: 198
[Submit][Status][Discuss]
Description
在野外训练中,为了确保每位参加集训的成员安全,实时的掌握和收集周边环境和队员信息非常重要,集训队采用的方式是在训练所在地散布N个小型传感器来收集并传递信息,这些传感器只与设在集训地中的信号塔进行通信,信号塔接收信号的覆盖范围是圆形,可以接收到所有分布在该集训区域内所有N个小型传感器(包括在该圆形的边上)发出的信号。信号塔的功率与信号塔接收范围半径的大小成正比,因为是野外训练,只能使用事先储备好的蓄电设备,因此在可以收集所有传感器信息的基础上,还应使得信号塔的功率最小。小龙帮助教官确定了一种信号塔设置的方案,既可以收集到所有N个传感器的信号,又可以保证这个信号塔的功率是最小的。同学们,你们知道,这个信号塔的信号收集半径有多大,它应该设置在何处吗?Input
共N+1行,第一行为正整数N(1≤N≤1000000),表示队员个数。接下来N行,每行两个实数用空格分开,分别是第i个队员的坐标X
Output
一行,共三个实数(中间用空格隔开),分别是信号塔的坐标,和信号塔 覆盖的半径。 (注:队员是否在边界上的判断应符合他到圆心的距离与信号塔接收半径之差的绝对值小于10^-6Sample Input
51.200 1.200
2.400 2.400
3.800 4.500
2.500 3.100
3.900 1.300
Sample Output
2.50 2.85 2.10HINT
1≤N≤500000随机增量法求最小圆覆盖。
三倍经验题~
详见【BZOJ 1336】
#include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <cstdio> #include <cstdlib> #define eps 1e-12 using namespace std; int n; double r; struct Point { double x,y; friend Point operator + (Point a,Point b) { return (Point){a.x+b.x,a.y+b.y}; } friend Point operator - (Point a,Point b) { return (Point){a.x-b.x,a.y-b.y}; } friend Point operator / (Point a,double p) { return (Point){a.x/p,a.y/p}; } }p[500005],o; double dis(Point a,Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } Point rev(Point x) { return (Point){-x.y,x.x}; } Point Geto(Point a,Point b,Point c) { Point x1=(a+b)/2,x2=(a+b)/2+rev(a-b),y1=(a+c)/2,y2=(a+c)/2+rev(a-c); if (fabs(y1.x-y2.x)<eps) swap(x1,y1),swap(x2,y2); double k2=(y1.y-y2.y)/(y1.x-y2.x),b2=y2.y-y2.x*k2; if (fabs(x1.x-x2.x)<eps) return (Point){x1.x,k2*x1.x+b2}; double k1=(x1.y-x2.y)/(x1.x-x2.x),b1=x2.y-k1*x2.x; double x=(b2-b1)/(k1-k2); return (Point){x,x*k1+b1}; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); for (int i=1;i<=n;i++) swap(p[rand()%n+1],p[rand()%n+1]); o=p[1],r=0.0; for (int i=2;i<=n;i++) { if (dis(o,p[i])<r+eps) continue; o=(p[i]+p[1])/2,r=dis(p[1],o); for (int j=2;j<i;j++) { if (dis(o,p[j])<r+eps) continue; o=(p[i]+p[j])/2,r=dis(p[i],o); for (int k=1;k<j;k++) { if (dis(o,p[k])<r+eps) continue; o=Geto(p[i],p[j],p[k]); r=dis(p[i],o); } } } printf("%.2lf %.2lf %.2lf\n",o.x,o.y,r); return 0; }
相关文章推荐
- BZOJ 2823: [AHOI2012]信号塔 随机增量法
- BZOJ 2823 AHOI2012 信号塔 计算几何
- 【AHOI2012】【BZOJ2823】信号塔
- 【BZOJ】2823: [AHOI2012]信号塔
- BZOJ 2823: [AHOI2012]信号塔
- 【BZOJ 2823】[AHOI2012]信号塔 随机增量
- 【bzoj2823】 AHOI2012—信号塔
- 【bzoj2823】【AHOI2012】【信号塔】【随机增量法】
- BZOJ 2823 [AHOI2012]信号塔 (最小圆覆盖学习笔记)
- bzoj2823【AHOI2012】信号塔
- BZOJ 2823: [AHOI2012]信号塔
- 【BZOJ2823】【AHOI2012】信号塔 最小圆覆盖 计算几何
- [BZOJ2823][AHOI2012]信号塔
- 【bzoj2823】 AHOI2012—信号塔
- bzoj2823[AHOI2012]信号塔
- bzoj 2823: [AHOI2012]信号塔 最小圆覆盖
- BZOJ 2823 AHOI 2012 信号塔 凸包+最小圆覆盖
- 【BZOJ 2823】【AHOI2012】【最小圆覆盖模板题】信号塔
- bzoj2822: [AHOI2012]树屋阶梯
- [BZOJ]2824: [AHOI2012]铁盘整理 dfs