Description

无线网络基站在理想状况下有效信号覆盖范围是个圆形。而无线基站的功耗与圆的半径的平方成正比。现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站 ……

就在你拿起键盘准备开始敲代码的时候,你的好朋友发明家SHTSC突然出现了。SHTSC刚刚完成了他的新发明——无线信号增幅仪。增幅仪能够在不增加无线基站功耗的前提下,使得有效信号的覆盖范围在某一特定方向上伸长若干倍。即:使用了增幅仪的无线基站覆盖范围是个椭圆,其功耗正比于半短轴长的平方。

现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站,并在增幅仪的帮助下使所有的用户都能接收到信号,且无线基站的功耗最小。

注意:由于SHTSC增幅仪的工作原理依赖地磁场,增幅的方向是恒定的。

Input

第一行一个整数:n。平面内的用户个数。

之后的n行每行两个整数x, y,表示一个用户的位置。

第n+2行一个整数:a。表示增幅仪的增幅方向,单位是度。表示增幅仪的方向是从x正方向逆时针转a度。

第n+3行一个整数:p。表示增幅仪的放大倍数。

Output

输出一行一个实数,为能够覆盖所有用户的最小椭圆的半短轴长,四舍五入到三位小数。

Sample Input

输入1:

2

1 0

-1 0

0

2

输入2:

3

1 1

-1 -1

0 0

45

7

Sample Output

输出1:

0.500

输出2:

0.202

Data Constraint

对于10%的数据,保证最优方案的中心在原点。

对于20%的数据,保证点是随机生成的。

对于30%的数据,n≤100。

对于50%的数据,n≤5000。

对于100%的数据,n≤50000,0≤a<180,1≤p≤100,|x|,|y|≤2×10^8。

Solution

  • 发现被拉长的“椭圆”和角度问题导致我们很难去统计答案。

  • 考虑简化它!

  • 我们可以将角度 aa 转正,再将每个点的纵坐标缩小 pp 倍。

  • 新的点的坐标可以通过三角函数的运算得出(画个图很好理解)。

  • 这样就可以用一个正常的圆来覆盖这些点了,经典的最小圆覆盖问题。

  • 现将点随机顺序,枚举每个点,在当前圆内就不管它。

  • 若超出当前圆,则说明该点在新圆的边上。

  • 以两点连线的中点作为新的圆的圆心,再继续枚举点。

  • 若还是超出,则说明该点也在新圆的边上。

  • 此时有三个点都在圆的边上,“三点确定一个圆”。

  • 作出两条中垂线,再求其交点即可。

  • 神奇的是,看上去是三重循环,但可证其时间复杂度是 O(N)O(N) 的。

Code

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
const int N=50005;
const double Pi=acos(-1);
struct node
{double x,y;
}a[N],t,O;
double R;
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline double sqr(double x)
{return x*x;
}
inline double dist(node x,node y)
{return sqrt(sqr(x.x-y.x)+sqr(x.y-y.y));
}
inline bool incircle(node x)
{return dist(O,x)<=R;
}
inline node midpoint(node x,node y)
{t.x=(x.x+y.x)/2.0;t.y=(x.y+y.y)/2.0;return t;
}
inline void get(double &x,double &y,double &z,node xx,node yy)
{if(xx.y==yy.y){x=1.0,y=0.0,z=-(xx.x+yy.x)/2.0;}elseif(xx.x==yy.x){x=0.0,y=1.0,z=-(xx.y+yy.y)/2.0;}else{t=midpoint(xx,yy);double k=-1.0/((xx.y-yy.y)*1.0/(xx.x-yy.x));x=k,y=-1.0,z=t.y-k*t.x;}
}
inline node work(node xx,node yy,node zz)
{double a1=0,b1=0,c1=0,a2=0,b2=0,c2=0;get(a1,b1,c1,xx,yy);get(a2,b2,c2,yy,zz);t.y=-(a2*c1-a1*c2)/(b1*a2-b2*a1);t.x=(-c1-b1*t.y)/a1;return t;
}
int main()
{int n=read();for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();double d=read()/180.0*Pi,p=read();if(!d){for(int i=1;i<=n;i++){swap(a[i].x,a[i].y);a[i].x=-a[i].x;a[i].y=a[i].y*1.0/p;}}elseif(d==Pi/2.0){for(int i=1;i<=n;i++) a[i].y=a[i].y*1.0/p;}else{double si=sin(d),co=cos(d),ta=tan(d);for(int i=1;i<=n;i++){double z=a[i].x-a[i].y/ta;t.x=z*si;t.y=a[i].y/si+z*co;t.y=t.y*1.0/p;a[i]=t;}}random_shuffle(a+1,a+1+n);for(int i=1;i<=n;i++)if(!incircle(a[i])){O=a[i],R=0;for(int j=1;j<i;j++)if(!incircle(a[j])){O=midpoint(a[i],a[j]);R=dist(O,a[i]);for(int k=1;k<j;k++)if(!incircle(a[k])){O=work(a[i],a[j],a[k]);R=dist(O,a[i]);}}}printf("%.3lf",R);return 0;
}

JZOJ 3660. 【SHTSC2014】信号增幅仪相关推荐

  1. BZOJ 3564 信号增幅仪

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3564 题意:给出平面上n个点,画出一个椭圆,椭圆的长轴是短轴的p倍,且长轴的方向为x轴逆时 ...

  2. P4288 [SHOI2014]信号增幅仪 最小圆覆盖

    传送门 题意:给出一些点,让后让你用一个ba=1p\frac{b}{a}=\frac{1}{p}ab​=p1​的且绕x正方向逆时针转动了a°的椭圆覆盖,求最小的b. 由于题目中椭圆是绕x正方向逆时针旋 ...

  3. BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)

    如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...

  4. 中地恒达振弦信号采集仪MCU采集模块

    1.产品概述 多通道振弦信号采集仪是一种岩土监测仪器,适用于钢弦式传感器输出的频率信号计算及温度采集.可用于大坝.桥梁.边坡等工程的应力.应变.变形.渗压等物理量监测和安全稳定分析. 本仪器采用当前最 ...

  5. NI推出第二款矢量信号收发仪,扩展创新性软件设计仪器平台

    ·NI在新的矢量信号收发仪(VST)上增加了I/Q连接,VST结合了矢量信号发生仪和矢量信号分析仪,并带有用户可编程的FPGA,用于实时信号处理和控制. ·工程师可以使用NI LabVIEW系统设计软 ...

  6. [SHOI2015]自动刷题机

    [SHOI2015]自动刷题机 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机--一种可以自动 AC 题目的神秘装置. 自动刷题机刷题的方式非常简单:首先会瞬间得出 ...

  7. [bzoj4590][Shoi2015]自动刷题机

    来自FallDream 的博客,未经允许,请勿转载,谢谢. 曾经发明了信号增幅仪的发明家ditoly又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动刷题机刷题的方式非常简单:首先 ...

  8. P4343 自动刷题机题解(二分)

    题目 题目背景 曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机--一种可以自动 AC 题目的神秘装置. 题目描述 自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法, ...

  9. cocos2dx 圆盘抽奖_easing--缓动函数--贝塞尔函数--圆盘转动抽奖应用

    一.transition 和 animation css上面两个属性允许你指定缓动函数. 不幸的是,他们不支持所有的缓动函数,所以你必须指定贝赛尔曲线实现缓动函数. 选取缓动函数以显示贝赛尔曲线. d ...

最新文章

  1. Ubuntu安装tomcat
  2. 一次非常有意思的 SQL 优化经历!
  3. ads无法启用状态服务器,NAC ADSSO 无法工作在Microsoft 2008服务器版本
  4. Filter Effects - 使用 CSS3 滤镜处理图片
  5. 1.eclipse怎么样新建web项目,eclipse新建web项目
  6. php ci oracle,CI连接Oracle 11G数据库
  7. 程序员如何保持身心健康
  8. Android mmap 文件映射到内存介绍
  9. sqlite 事务处理 java_SQLite事务处理
  10. Linux系统 Centos6 安装
  11. 看清喽别迷糊 英特尔本CPU型号之乱
  12. virtualbox 装win95 win98
  13. vsftp配置问题启示录
  14. OpenDDS简单示例,轻松入门
  15. mobile_net在spyder下载不下来
  16. 计算机制作ppt考试题,计算机二级PPT真题:制作计算机发展简史PPT
  17. HTML网页制作——制作一个属于自己的网页
  18. java新手初次面试要注意的事项
  19. PS各个工具的字母快捷键和英…
  20. 如何查看服务器bmc信息,服务器查看bmcip地址

热门文章

  1. win10: Coursera 视频无法观看问题解决。
  2. 在.c文件中调用cuda函数
  3. caffe源码分析:softmax_layer.cpp softmax_loss_layer.cpp
  4. 超赞的 PyTorch 资源大列表,有人把它翻译成了中文版!
  5. 吴恩达《构建机器学习项目》精炼笔记(1)-- 机器学习策略(上)
  6. 对路径的访问被拒绝怎么办_学习了解ACL—扩展访问控制列表,就在网工知识角...
  7. [Embeding-2]文本表示学习-词嵌入入门理解
  8. VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)
  9. [OS复习]虚拟存储管理技术 1
  10. 使用Delphi命名空间