2018.10.15 bzoj3564: [SHOI2014]信号增幅仪(坐标处理+最小圆覆盖)

版权声明:随意转载哦......但还是请注明出处吧: https://blog.csdn.net/dreaming__ldx/article/details/83065460

传送门
省选考最小圆覆盖?
亦可赛艇(你们什么都没看见)


在大佬的引领下成功做了出来。
就是旋转坐标使椭圆的横轴跟 x x 轴平行。
然后压缩横坐标使得其变成一个圆。
然后跑最小覆盖圆就可以了。
注意题目给的是角度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;
}

猜你喜欢

转载自blog.csdn.net/dreaming__ldx/article/details/83065460
今日推荐