bzoj3564

洛谷P4288

可以旋转一下坐标轴使得x轴与长轴方向对齐,然后将所有的横坐标变为自身除以放大倍数,然后就做一个最小圆覆盖

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<ctime>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
namespace X
{
const double pi=acos(-);
const double eps=1e-;
struct Point
{
double x,y;
Point(double x=,double y=):x(x),y(y){}
};
typedef Point Vec;
Vec operator+(const Vec& a,const Vec& b)
{
return Vec(a.x+b.x,a.y+b.y);
}
Vec operator-(const Vec& a,const Vec& b)
{
return Vec(a.x-b.x,a.y-b.y);
}
Vec operator*(double a,const Vec& b)
{
return Vec(a*b.x,a*b.y);
}
Vec operator*(const Vec& a,double b)
{
return Vec(b*a.x,b*a.y);
}
Vec operator/(const Vec& a,double b)
{
return Vec(a.x/b,a.y/b);
}
int dcmp(double x)
//正为1,负为-1,0为0
{
if(fabs(x)<eps) return ;
return x<?-:;
}
bool operator==(const Vec& a,const Vec& b)
//判向量相等
{
return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
}
double dot(const Vec& a,const Vec& b)
//点积
{
return a.x*b.x+a.y*b.y;
}
double cross(const Vec& a,const Vec& b)
//叉积
{
return a.x*b.y-a.y*b.x;
}
double len(const Vec& x)
//向量长度
{
return sqrt(dot(x,x));
}
double angle(const Vec& a,const Vec& b)
//夹角,0~180°
{
return acos(dot(a,b)/len(a)/len(b));
}
double angle1(const Vec& a,const Vec& b)
//夹角,带方向,a到b逆时针为正,顺时针为负,共线为0
{
return acos(dot(a,b)/len(a)/len(b))*(dcmp(cross(a,b)));
}
Vec rotate(const Vec& a,double rad)
//旋转,正为逆时针,负为顺时针
{
return Vec(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
}
Vec normal(const Vec& x)
//单位法线,左转90°后除以自身长度
{
double l=len(x);
return Vec(-x.y/l,x.x/l);
}
Vec normal1(const Vec& x)
//法线,不归一化
{
return Vec(-x.y,x.x);
}
Point lineline(const Point& p,const Vec& v,const Point& q,const Vec& w)
//直线交点,GetLineIntersection
{
return p+v*cross(w,p-q)/cross(v,w);
}
double ptline(const Point& p,const Point& a,const Point& b)
//point_to_line,点到直线距离,DistanceToLine
{
Vec v1=b-a,v2=p-a;
return fabs(cross(v1,v2)/len(v1));
}
double ptseg(const Point& p,const Point& a,const Point& b)
//point_to_segment,点到线段距离,DistanceToSegment
{
if(a==b) return len(p-a);
//Vec v1=b-a,v2=a-p,v3=p-b;
Vec v1=b-a,v2=p-a,v3=p-b;
if(dcmp(dot(v1,v2))<) return len(v2);
else if(dcmp(dot(v1,v3))>) return len(v3);
else return fabs(cross(v1,v2)/len(v1));
}
double area2(const Point& a,const Point& b,const Point& c)
//叉积对应平行四边形的面积
{
return cross(b-a,c-a);
}
double thrarea(const Point& a,const Point& b,const Point& c)
//三角形面积,绝对值
{
return fabs(cross(b-a,c-a)/);
}
bool ifpar(const Vec& a,const Vec& b)
//ifParallel
//是否共线/平行
{
return dcmp(cross(a,b))==;
}
Point pointline(const Point& p,const Point& a,const Vec& v)
//点在直线上投影,GetLineProjection
{
return a+v*(dot(p-a,v)/dot(v,v));
}
double sqr(double x){return x*x;}
double dis2(const Point &x,const Point &y)
{
return sqr(x.x-y.x)+sqr(x.y-y.y);
}
double len2(const Vec &x){return dot(x,x);}
};
using namespace X;
Point p[];
int n;
Point a;
double r2;
double A,B;
void make(const Point &x,const Point &y)
{
Vec t=(y-x)/;
a=x+t;
r2=len2(t);
}
void make(const Point &x,const Point &y,const Point &z)
{
Vec t1=(y-x)/,t2=(z-y)/;
Point x1=x+t1,y1=y+t2;
t1=normal1(t1);t2=normal1(t2);
a=lineline(x1,t1,y1,t2);
r2=dis2(a,x);
}
bool ok(const Point &x)
{
return dcmp(dis2(x,a)-r2)<=;
}
int main()
{
int i,j,k;
srand(time());
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
scanf("%lf%lf",&A,&B);A=A/*pi;
for(i=;i<=n;i++)
p[i]=rotate(p[i],-A);
for(i=;i<=n;i++)
p[i].x/=B;
random_shuffle(p+,p+n+);
a=p[];r2=;
for(i=;i<=n;i++)
if(!ok(p[i]))
{
a=p[i];r2=;
for(j=;j<i;j++)
if(!ok(p[j]))
{
make(p[i],p[j]);
for(k=;k<j;k++)
if(!ok(p[k]))
{
make(p[i],p[j],p[k]);
}
}
}
//uprintf("%.2f %.2f ",a.x,a.y);
printf("%.3f\n",sqrt(r2));
return ;
}

洛谷P4288||bzoj3564 [SHOI2014]信号增幅仪的更多相关文章

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

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

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

    传送门 省选考最小圆覆盖? 亦可赛艇(你们什么都没看见) 在大佬的引领下成功做了出来. 就是旋转坐标使椭圆的横轴跟xxx轴平行. 然后压缩横坐标使得其变成一个圆. 然后跑最小覆盖圆就可以了. 注意题目 ...

  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. BZOJ3564 信号增幅仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=3564 思路:先旋转坐标系,再缩进x坐标,把椭圆变成圆,然后做最小圆覆盖. 还有,为什么用srand( ...

随机推荐

  1. MFC窗口消息PostMessage和SendMessage

    以前这些消息用得比较少,但是今天碰到了个事儿,我看非用消息不可. 事情是这样的,我在线程中需要刷新对话框上面的内容,但是每每执行到UpdateData时就出现了断言错误. 查了相关资料,发现这个可能是 ...

  2. WebDriver API——浏览器控制暨如何学习webdriver API

    在测试过程中我们可能需要对浏览器进行控制,大小控制啊,刷新页面啊,前进后退等等,最常用的两个接口是window和Navigation. 我们最常用的就是这4个,那么你是否感兴趣它们后面是什么,它们是怎 ...

  3. Xshell和secureCRT

    作为一名测试人员,xshell和secureCRT用它们来查看日志.排查定位问题,用的时间长了总感觉只是摸着点皮毛,连这两个工具的名字以及它的工作原理都不清楚,就查了点资料来多了解下,虽然可能在日常工 ...

  4. linux应用之samba服务的安装及配置(centos)

    一.安装方式: 本文通过yum来重新进行Samba服务器的安装与配置. 二.Samba的简介: Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Me ...

  5. codeforces 701C C. They Are Everywhere(尺取法)

    题目链接: C. They Are Everywhere time limit per test 2 seconds   memory limit per test 256 megabytes inp ...

  6. 最基本PSO算法的C++实现

    按照James Kennedy & Russell Eberhart (1995)的版本,算法过程如下: [x*] = PSO() P = Particle_Initialization(); ...

  7. Messes in Reading Source Coding of SSD

    这里记录在学习SSD源码过程中用到的相关内容 keras.applications.imagenet_utils.preprocess_input(): 用来将读入的原始图片张量转换成为需要Image ...

  8. rkhunter和chkrootkit

    今天继续检查我的Linux,所以下来rkhunter和chkrootkit一个一个来,下面只记录命令,少些说明不截图了. 1.rkhunter #cd /temp #wget http://downl ...

  9. npm --- Node.js包管理器

    目录 1. 安装Node.js 2. 运行npm 3. npm介绍 3.1 安装插件 3.2 更新插件 3.3 卸载插件 3.4 查看当前目录中的插件列表 4. 使用cnpm 4.1 安装 npm( ...

  10. Azure Key Vault (1) 入门

    <Windows Azure Platform 系列文章目录> 为什么要使用Azure Key Vault? 我们假设在微软云Azure上有1个场景,在Windows VM里面有1个.NE ...