传送门

省选考最小圆覆盖?

亦可赛艇(你们什么都没看见)


在大佬的引领下成功做了出来。

就是旋转坐标使椭圆的横轴跟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]信号增幅仪(坐标处理+最小圆覆盖)的更多相关文章

  1. 洛谷P4288||bzoj3564 [SHOI2014]信号增幅仪

    bzoj3564 洛谷P4288 可以旋转一下坐标轴使得x轴与长轴方向对齐,然后将所有的横坐标变为自身除以放大倍数,然后就做一个最小圆覆盖 #include<cstdio> #includ ...

  2. BZOJ3564 : [SHOI2014]信号增幅仪

    先把所有点绕原点逆时针旋转(360-a)度,再把所有点横坐标除以放大倍数p,最后用随机增量法求最小圆覆盖即可. 时间复杂度期望$O(n)$ #include<cstdio> #includ ...

  3. BZOJ 3564: [SHOI2014]信号增幅仪 最小圆覆盖

    3564: [SHOI2014]信号增幅仪 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3564 Description 无线网络基站在 ...

  4. 【bzoj3564】 [SHOI2014]信号增幅仪

    题目描述: 无线网络基站在理想状况下有效信号覆盖范围是个圆形.而无线基站的功耗与圆的半径的平方成正比. 现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站.... 就在你拿起键盘准备开 ...

  5. [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】

    题目链接:BZOJ - 3564 题目分析 求最小椭圆覆盖,题目给定了椭圆的长轴与 x 轴正方向的夹角,给定了椭圆长轴与短轴的比值. 那么先将所有点旋转一个角度,使椭圆长轴与 x 轴平行,再将所有点的 ...

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

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

  7. [SHOI2014]信号增幅仪

    题目大意: 平面直角坐标系中散落着n个点,一个椭圆的长半轴在对于x轴逆时针旋转α度的角度上,且长半轴是短半轴的k倍. 问短半轴至少要多长才能覆盖所有的点? 思路: 首先把坐标顺时针旋转α度,然后把所有 ...

  8. [LOJ 2190] 「SHOI2014」信号增幅仪

    [LOJ 2190] 「SHOI2014」信号增幅仪 链接 链接 题解 坐标系直到 \(x\) 轴与椭圆长轴平行 点的坐标变换用旋转公式就可以了 因为是椭圆,所以所有点横坐标除以 \(p\) 然后最小 ...

  9. LOJ#2190. 「SHOI2014」信号增幅仪(最小圆覆盖)

    题面 传送门 题解 我连椭圆是个啥都不知道导致这么简单一道题我一点思路都没有-- 我们把坐标系旋转一下,让半长轴成为新的\(x\)轴,也就是说所有点都绕原点逆时针旋转\(360-a\)度,然后再把所有 ...

随机推荐

  1. MySQLNonTransientConnectionException: No operations allowed after connection closed

    原因分析 查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是: Mysql服务器默认的"wait_timeout"是8小时,也就是说一个 ...

  2. 下载的chm文件打不开问题

    下载的chm文件无法打开,是因为此文件是在其它电脑上编辑的,上面留有原电脑的信息,当下载打开时,发现电脑信息不一致,因此会将应用锁定. 操作:文件  -->  属性  -->常规 --&g ...

  3. UI5-文档-4.21-Data Types

    发票清单已经很好看了,但是没有指定价格的发票是什么?通常价格以技术格式存储,并带有'.数据模型中的分隔符.例如,我们的菠萝发票上的计算价格是87.2,没有货币.我们将使用SAPUI5数据类型正确地格式 ...

  4. ios 避免navigationcontroller出现时scrollview内容被resize

    viewDidLoad中设置以下属性 self.automaticallyAdjustsScrollViewInsets = NO;

  5. mysql 慢查询记录方法

    ========================================================= 方法一: 这个方法我正在用,呵呵,比较喜欢这种即时性的. Mysql5.0以上的版本 ...

  6. JSTL标签库学习记录2-fmt

    fmt的标签为辅助性功能标签 设置编码 <fmt:requestEncoding value=""> 国际化相关 <fmt:setLocale value=&qu ...

  7. Linux启动提示Kernel panic - not syncing: Attempted to kill init解决办法

    系统类型:CentOS 6.5(x64) 启动提示:Kernel panic - not syncing: Attempted to kill init 解决办法: 系统启动的时候,按下‘e’键进入g ...

  8. How to Pronounce the Word SOMETHING

    How to Pronounce the Word SOMETHING Share Tweet Share Something tells me you’re going to like this v ...

  9. 关于struts2输出excel表

    web.xml: <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com ...

  10. linux下面得小数计算

    可以通过命令行向awk中传递参数. 这样子传递进去的参数,在awk命令中可以访问.每一项都必须作为单一的一个参数来解释.所以,等号之间不能有空格. 比如说我们传递进去一个学生名字,想查这个学生的得分. ...