牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板
链接:https://www.nowcoder.com/acm/contest/141/J
来源:牛客网
Eddy has M choices to work in the future. For each working place, it can be represented as a point on 2D-plane. And, for each working place, Eddy has two magic parameters P and Q such that if Eddy is going to work in this place, he will choose a place to live which is closer to the working place than portion of all possible living place choices.
Now, Eddy is wondering that for each working place, how far will he lives to the working place. Since Eddy is now busy on deciding where to work on, you come to help him calculate the answers.
For example, if the coordinates of points of Tien-long country is (0,0), (2,0), (2, 2), (0, 2) in counter-clockwise order. And, one possible working place is at (1,1) and P=1, Q=2. Then, Eddy should choose a place to live which is closer to (1, 1) than half of the choices. The distance from the place Eddy will live to the working place will be about 0.7978845608.
输入描述:
The first line contains one positive integer N indicating the number of points of the polygon representing Tien-long country.
Each of following N lines contains two space-separated integer (x
i
, y
i
) indicating the coordinate of i-th points. These points is given in clockwise or counter-clockwise order and form the polygon.
Following line contains one positive integer M indicating the number of possible working place Eddy can choose from.
Each of following M lines contains four space-separated integer x
j
, y
j
, P, Q, where (x
j
, y
j
) indicating the j-th working place is at (x
j
, y
j
) and magic parameters is P and Q.
3 ≤ N ≤ 200
1 ≤ M ≤ 200
1 ≤ P < Q ≤ 200
|x
i
|, |y
i
|, |x
j
|, |y
j
| ≤ 103
It's guaranteed that the given points form a simple polygon.
输出描述:
Output M lines. For i-th line, output one number indicating the distance from the place Eddy will live to the i-th working place. Absolutely or relatively error within 10-6
will be considered correct.
输入例子:
4
0 0
2 0
2 2
0 2
1
1 1 1 2
输出例子:
0.797884560809
-->
输出
1.040111537176
0.868735603376
题意:给你一个多变形,再给你几个圆心点,问每个圆心点的半径为多少时,圆的面积为多边形面积的(1-p/q)
分析:一个多边形与圆相交的模板题,求圆心点半径的时候二分就行,限制二分次数保证精度
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib> using namespace std; const double eps = 1e-9;
const double PI = acos(-1.0); int dcmp(double x)
{
if( x > eps ) return 1;
return x < -eps ? -1 : 0;
} struct Point
{
double x,y;
Point()
{
x = y = 0;
}
Point(double a,double b)
{
x = a;
y = b;
}
inline void input()
{
scanf("%lf%lf",&x,&y);
}
inline Point operator-(const Point &b)const
{
return Point(x - b.x,y - b.y);
}
inline Point operator+(const Point &b)const
{
return Point(x + b.x,y + b.y);
}
inline Point operator*(const double &b)const
{
return Point(x * b,y * b);
}
inline double dot(const Point &b)const
{
return x * b.x + y * b.y;
}
inline double cross(const Point &b,const Point &c)const
{
return (b.x - x) * (c.y - y) - (c.x - x) * (b.y - y);
}
inline double Dis(const Point &b)const
{
return sqrt((*this-b).dot(*this-b));
}
inline bool InLine(const Point &b,const Point &c)const //三点共线
{
return !dcmp(cross(b,c));
}
inline bool OnSeg(const Point &b,const Point &c)const //点在线段上,包括端点
{
return InLine(b,c) && (*this - c).dot(*this - b) < eps;
}
int operator^(const Point &b) const
{
return y*b.x-x*b.y;
}
}; inline double min(double a,double b)
{
return a < b ? a : b;
}
inline double max(double a,double b)
{
return a > b ? a : b;
}
inline double Sqr(double x)
{
return x * x;
}
inline double Sqr(const Point &p)
{
return p.dot(p);
} Point LineCross(const Point &a,const Point &b,const Point &c,const Point &d)
{
double u = a.cross(b,c), v = b.cross(a,d);
return Point((c.x * v + d.x * u) / (u + v), (c.y * v + d.y * u) / (u + v));
} double LineCrossCircle(const Point &a,const Point &b,const Point &r,
double R,Point &p1,Point & p2)
{
Point fp = LineCross(r, Point(r.x+a.y-b.y, r.y+b.x-a.x), a, b);
double rtol = r.Dis(fp);
double rtos = fp.OnSeg(a, b) ? rtol : min(r.Dis(a), r.Dis(b));
double atob = a.Dis(b);
double fptoe = sqrt(R * R - rtol * rtol) / atob;
if( rtos > R - eps ) return rtos;
p1 = fp + (a - b) * fptoe;
p2 = fp + (b - a) * fptoe;
return rtos;
} double SectorArea(const Point &r,const Point &a,const Point &b,double R) //不大于180度扇形面积,r->a->b逆时针
{
double A2 = Sqr(r - a), B2 = Sqr(r - b), C2 = Sqr(a - b);
return R * R * acos( (A2 + B2 - C2) * 0.5 / sqrt(A2) / sqrt(B2)) * 0.5;
} double TACIA(const Point &r,const Point &a,const Point &b,double R)
{
double adis = r.Dis(a), bdis = r.Dis(b);
if( adis < R + eps && bdis < R + eps )
return r.cross(a, b) * 0.5;
Point ta, tb;
if( r.InLine(a,b) ) return 0.0;
double rtos = LineCrossCircle(a, b, r, R, ta, tb);
if( rtos > R - eps )
return SectorArea(r, a, b, R);
if( adis < R + eps )
return r.cross(a, tb) * 0.5 + SectorArea(r, tb, b, R);
if( bdis < R + eps )
return r.cross(ta, b) * 0.5 + SectorArea(r, a, ta, R);
return r.cross(ta, tb) * 0.5 + SectorArea(r, tb, b, R) + SectorArea(r, a, ta, R);
} const int MAXN = 505;
Point p[MAXN]; double SPICA(int n,Point r,double R)
{
int i;
double ret = 0, if_clock_t;
for( i = 0 ; i < n ; ++i )
{
if_clock_t = dcmp(r.cross(p[i], p[(i + 1) % n]));
if( if_clock_t < 0 )
ret -= TACIA(r, p[(i + 1) % n], p[i], R);
else ret += TACIA(r, p[i], p[(i + 1) % n], R);
}
return fabs(ret);
} double ComputePolygonArea(int n)
{
double sum=0;
for(int i=1;i<=n-1;i++)
sum+=(p[i]^p[i-1]);
sum+=(p[0]^p[n-1]);
return fabs(sum/2);
} int main()
{
int n,m;
scanf("%d",&n);///多边形n个顶点
for(int i = 0 ; i < n ; ++i )///顶点坐标
p[i].input();
double polyArea = ComputePolygonArea(n);///计算多边形面积
scanf("%d",&m);
while(m--)
{ Point circle;
circle.input(); ///圆心坐标
int pp,qq;
scanf("%d%d",&pp,&qq);
double area = (1.0-(double)pp/qq)*polyArea; ///二分圆的半径
// printf("%f\n",area);
double l =0, r=1e18;
///固定二分次数
for(int i=1;i<300;i++){
double mid = (l+r)/2.0;
double insection = SPICA(n,circle,mid); ///圆与多边形交的面积
if(insection>area){
r = mid-eps;
}else{
l = mid;
}
}
printf("%.10lf\n",r);
}
return 0;
}
牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板的更多相关文章
- 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)
题目链接: https://www.nowcoder.com/acm/contest/140/J 思路: 都写在代码注释里了,非常好懂.. for_each函数可以去看一下,遍历起vector数组比较 ...
- 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?
牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...
- 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学
牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)
链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...
- 牛客网暑期ACM多校训练营(第九场) A题 FWT
链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...
- 牛客网暑期ACM多校训练营(第九场)D
链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...
- 牛客网暑期ACM多校训练营(第二场)B discount
链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
随机推荐
- 有容云:上车 | 听老司机谈Docker安全合规建设
编者注: 本文根据7月19日DockOne社群分享内容整理而成,分享嘉宾蒋运龙,有容云高级咨询顾问,一个IT的老兵,十年来混迹于存储.三网融合.多屏互动.智能穿戴.第三方支付.Docker等行业:经历 ...
- Intent 常用方法总结
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本文主要是总结Intent 常用的方法,并封装成Utils类中 主要涉及以下内容 ...
- python基础之变量与数据类型
变量在python中变量可以理解为在计算机内存中命名的一个存储空间,可以存储任意类型的数据.变量命名变量名可以使用英文.数字和_命名,且不能用数字开头使用赋值运算符等号“=”用来给变量赋值.变量赋值等 ...
- 0R电阻在PCB布线中对布线畅通的一个小妙用
在PCB布线中,我们都会尽量节约板子空间,将元器件排布的紧密一些,难免会遇到布线不通的时候. 博主下面就来说一个关于0R电阻在PCB布线使之畅通的一个小妙用. 使用0R电阻前 假设我们这个TXD的线周 ...
- C#连接SQL Anywhere 12 数据库
using System;using System.Data.Common; namespace ConsoleApplication27{ class Program { ...
- table 表格 细边框 最简单样式
table 表格细边框的效果实现方法虽然不难,但网上简单有效的方法却很少,在此记录一下 css 样式 /** table 细边框 **/ table{border-collapse: collapse ...
- 1.1Django简介和虚拟环境配置
MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封装 v表示 ...
- python语言特点简介 以及在Windows以及Mac中安装以及配置的注意事项
正如前一篇随笔所提到的,python属于解释型语言 python语言有两个特点: 1.胶水语言(历史遗留问题,原来Perl语言作为Unix内置标准件,获得极大追捧,作为竞争者的python一开始是作为 ...
- AutoCAD .NET: 遍历模型空间
原文:http://spiderinnet1.typepad.com/blog/2012/06/autocad-net-iterate-through-model-space.html https:/ ...
- lumen错误 NotFoundHttpException in RoutesRequests.php line 442:
解决:进入 public/index.PHP 将 $app->run(); 修改成下面的: $request = Illuminate\Http\Request::capture(); $app ...