2018.10.15 bzoj3564: [SHOI2014]信号增幅仪(坐标处理+最小圆覆盖)
传送门
省选考最小圆覆盖?
亦可赛艇(你们什么都没看见)
在大佬的引领下成功做了出来。
就是旋转坐标使椭圆的横轴跟xxx轴平行。
然后压缩横坐标使得其变成一个圆。
然后跑最小覆盖圆就可以了。
注意题目给的是角度233.
代码里有其他计算几何的板子。
代码:
#include<bits/stdc++.h>
#define db double
#define N 50005
using namespace std;
const double pi=acos(-1.0);
struct pot{db x,y;}p[N],O;
struct line{db a,b,c;};
inline pot operator-(const pot&a,const pot&b){return (pot){a.x-b.x,a.y-b.y};}
inline pot operator+(const pot&a,const pot&b){return (pot){a.x+b.x,a.y+b.y};}
inline db operator^(const pot&a,const pot&b){return a.x*b.y-a.y*b.x;}
inline db operator*(const pot&a,const pot&b){return a.x*b.x+a.y*b.y;}
inline db mod(const pot&a){return sqrt(a.x*a.x+a.y*a.y);}
inline db dis(const pot&a,const pot&b){return mod(a-b);}
inline bool check(const pot&x,const db r){return dis(O,x)<=r;}
inline db mul(const double&x){return x*x;}
inline pot calc(line a,line b){return (pot){(b.c*a.b-a.c*b.b)/(a.a*b.b-a.b*b.a),(b.c*a.a-a.c*b.a)/(a.b*b.a-b.b*a.a)};}
inline int read(){
int ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
int n;
db P,a,r;
int main(){
n=read();
for(int i=1;i<=n;++i)p[i].x=read(),p[i].y=read();
a=1.0*read()/180.0*pi,P=read();
for(int i=1;i<=n;++i){
db jiao=atan2(p[i].y,p[i].x),len=sqrt(p[i].x*p[i].x+p[i].y*p[i].y),x1=len*cos(jiao-a),y1=len*sin(jiao-a);
p[i]=(pot){x1/P,y1};
}
random_shuffle(p+1,p+n+1),r=0;
for(int i=1;i<=n;++i){
if(check(p[i],r))continue;
O.x=p[i].x,O.y=p[i].y,r=0;
for(int j=1;j<i;++j){
if(check(p[j],r))continue;
O=(pot){(p[i].x+p[j].x)/2,(p[i].y+p[j].y)/2},r=dis(p[i],p[j])/2;
for(int k=1;k<j;++k){
if(check(p[k],r))continue;
O=calc((line){2*(p[i].x-p[k].x),2*(p[i].y-p[k].y),mul(p[k].x)+mul(p[k].y)-mul(p[i].x)-mul(p[i].y)},(line){2*(p[i].x-p[j].x),2*(p[i].y-p[j].y),mul(p[j].x)+mul(p[j].y)-mul(p[i].x)-mul(p[i].y)});
r=dis(p[i],O);
}
}
}
printf("%.3lf",r);
return 0;
}
2018.10.15 bzoj3564: [SHOI2014]信号增幅仪(坐标处理+最小圆覆盖)的更多相关文章
- 洛谷P4288||bzoj3564 [SHOI2014]信号增幅仪
bzoj3564 洛谷P4288 可以旋转一下坐标轴使得x轴与长轴方向对齐,然后将所有的横坐标变为自身除以放大倍数,然后就做一个最小圆覆盖 #include<cstdio> #includ ...
- BZOJ3564 : [SHOI2014]信号增幅仪
先把所有点绕原点逆时针旋转(360-a)度,再把所有点横坐标除以放大倍数p,最后用随机增量法求最小圆覆盖即可. 时间复杂度期望$O(n)$ #include<cstdio> #includ ...
- BZOJ 3564: [SHOI2014]信号增幅仪 最小圆覆盖
3564: [SHOI2014]信号增幅仪 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3564 Description 无线网络基站在 ...
- 【bzoj3564】 [SHOI2014]信号增幅仪
题目描述: 无线网络基站在理想状况下有效信号覆盖范围是个圆形.而无线基站的功耗与圆的半径的平方成正比. 现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站.... 就在你拿起键盘准备开 ...
- [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】
题目链接:BZOJ - 3564 题目分析 求最小椭圆覆盖,题目给定了椭圆的长轴与 x 轴正方向的夹角,给定了椭圆长轴与短轴的比值. 那么先将所有点旋转一个角度,使椭圆长轴与 x 轴平行,再将所有点的 ...
- BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)
如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...
- [SHOI2014]信号增幅仪
题目大意: 平面直角坐标系中散落着n个点,一个椭圆的长半轴在对于x轴逆时针旋转α度的角度上,且长半轴是短半轴的k倍. 问短半轴至少要多长才能覆盖所有的点? 思路: 首先把坐标顺时针旋转α度,然后把所有 ...
- [LOJ 2190] 「SHOI2014」信号增幅仪
[LOJ 2190] 「SHOI2014」信号增幅仪 链接 链接 题解 坐标系直到 \(x\) 轴与椭圆长轴平行 点的坐标变换用旋转公式就可以了 因为是椭圆,所以所有点横坐标除以 \(p\) 然后最小 ...
- LOJ#2190. 「SHOI2014」信号增幅仪(最小圆覆盖)
题面 传送门 题解 我连椭圆是个啥都不知道导致这么简单一道题我一点思路都没有-- 我们把坐标系旋转一下,让半长轴成为新的\(x\)轴,也就是说所有点都绕原点逆时针旋转\(360-a\)度,然后再把所有 ...
随机推荐
- restfull 风格 参考 https://blog.csdn.net/jaryle/article/details/52141097
https://www.cnblogs.com/xiaoxian1369/p/4332390.html :
- 我对if(!this.IsPostBack)的理解
if(!this.IsPostBack) { } 通常用在page_load中,获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问,如果是为响应客户端回发而加载该页,则 ...
- AJAX服务器返回数据 连接数据库查询数据
getcustomer.asp" 中的源代码负责对数据库进行查询,然后用 HTML 表格返回结果: <% response.expires=-1 sql="SELECT * ...
- 任务调度的方式:Timer、ScheduledExecutorService、spring task、quartz、XXL-JOB、Elastic-Job
任务调度 定时任务调度:基于给定的时间点.给定的时间间隔.给定的执行次数自动执行的任务. Timer 介绍 Timer,简单无门槛,一般也没人用. Timer位于java.util包下,其内部包含且仅 ...
- eclipse 断点找到同名的其它类
转载自Eclipse断点进入另一个项目的同名Java文件中(http://tunps.com/p/11789.html) eclipse 断点找到同名的其它类 A和B是两个相同的项目,A一直本地,B是 ...
- Java多线程对同一个对象进行操作
示例: 三个窗口同时出售20张票. 程序分析: 1.票数要使用一个静态的值. 2.为保证不会出现卖出同一张票,要使用同步锁. 3.设计思路:创建一个站台类Station,继承THread,重写run方 ...
- python爬虫(5)--正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 1.了解正则表达式 正则表达式 ...
- js中声明函数的方法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- git hg提交拉取
工作总结web_acl 535 git clone “ssh://git@outergit.yonyou.com:49622/esn_web/web_acl.git" 600 git bra ...
- conductor 系统任务
动态任务: 参数: dynamicTaskNameParam:来自任务输入的参数的名称,其值用于调度任务. 例如 如果参数的值为ABC,则调度的下一个任务类型为“ABC”. Example { &qu ...