题面

题意转化为:

判断每个点所在的圆有多长的弧度角位于多边形内部。

然后就很暴力了。

每个点P,直接找到多边形和这个圆的所有交点,按照距离P的角度排序。

找交点,直接联立二元二次方程组。。。。

需要判断一段弧是否在多边形内部。

向量随机旋转角度,判断点是否在多边形内部即可。

如果该点在多边形边上,返回-1,重新旋转。

由于double,所以不会出现射线在多边形边上情况。

注意:

(0,0)要特判是否在多边形内部。+eps判断

#include<bits/stdc++.h>
#define reg register int
using namespace std;
// using namespace Modulo;
namespace Miracle{
const int N=;
const double eps=1e-;
const double inf=1e8;
const double Pi=acos(-);
int n,m;
struct po{
double x,y;
po(){}
po(double xx,double yy){
x=xx;y=yy;
}
double friend operator *(po a,po b){
return a.x*b.y-a.y*b.x;
}
double dis(){
return sqrt(x*x+y*y);
}
po friend operator -(po a,po b){
return po(a.x-b.x,a.y-b.y);
}
double deg(){
return atan2(y,x);
}
po xuan(double d){
double nd=deg()-d;
double len=dis();
return po(len*cos(nd),len*sin(nd));
}
void op(){
cout<<"("<<x<<","<<y<<")"<<endl;
}
}p[N],q[N];
struct node{
po P;
double c;
node(){}
node(double cc,po PP){
c=cc;P=PP;
}
bool friend operator <(node a,node b){
return a.c<b.c;
}
}cur[N];
struct line{
double k,b;
po A,B;
double f(double x){
if(k<inf) return k*x+b;
return A.y;
}
}l[N];
bool on(po c,line L){//c on L?
if(c.x+eps>=L.A.x&&c.x<=L.B.x+eps){
if(L.k==inf) {
if(c.y+eps>=L.A.y&&c.y<=L.B.y+eps) return ;
}
else{double ny=L.f(c.x);
if(fabs(ny-c.y)<eps) return ;}
}
return ;
}
bool jiao(line a,line b){
double c1=(a.A-b.A)*(a.A-b.B),c2=(a.B-b.A)*(a.B-b.B);
double c3=(b.A-a.A)*(b.A-a.B),c4=(b.B-a.A)*(b.B-a.B);
if(c1*c2<=&&c3*c4<=) return true;
return false;
}
int in(po a){
int cnt=;
line now;
now.k=;now.b=a.y;
now.A=a;now.B=po(inf,a.y);
for(reg i=;i<=m;++i){
if(on(a,l[i])) return -;
if(jiao(now,l[i])) ++cnt;
}
if(cnt&) return ;
return ;
}
double cha(double d1,double d2){
if(d1>=&&d2<=){
return d1-d2;
}else if(d1>=&&d2>=){
if(d1>d2) return d1-d2;
return *Pi-(d2-d1);
}else if(d1<=&&d2>=){
return *Pi-(d2-d1);
}else if(d1<=&&d2<=){
if(d1>d2) return (d1-d2);
return *Pi-(d2-d1);
}
return ;
}
double sui(){
return (double)rand()/(RAND_MAX);
}
double calc(po a){
int cnt=;
double r=a.dis();
if(r==){
a.y+=eps;
if(in(a)==) return *Pi;
else return ;
}
for(reg i=;i<=m;++i){
if(l[i].k<inf){
double A=(+l[i].k*l[i].k);
double B=*l[i].k*l[i].b;
double C=l[i].b*l[i].b-r*r;
double deta=B*B-*A*C;
if(deta>=){
double x1=(-B+sqrt(deta))/(*A),x2=(-B-sqrt(deta))/(*A);
po now=po(x1,l[i].f(x1));
if(on(now,l[i])) {
cur[++cnt]=node(cha(a.deg(),now.deg()),now);
}
now=po(x2,l[i].f(x2));
if(on(now,l[i])){
cur[++cnt]=node(cha(a.deg(),now.deg()),now);
}
}
}else{
double lp=r*r-l[i].A.x*l[i].A.x;
double X=l[i].A.x;
if(lp>){
double Y=sqrt(lp);
po now=po(X,Y);
if(on(now,l[i])) {
cur[++cnt]=node(cha(a.deg(),now.deg()),now);
}
Y=-sqrt(lp);
now=po(X,Y);
if(on(now,l[i])){
cur[++cnt]=node(cha(a.deg(),now.deg()),now);
}
}
}
} cur[++cnt]=node(,a);
cur[++cnt]=node(*Pi,a);
sort(cur+,cur+cnt+);
double ret=;
for(reg i=;i<=cnt;++i){
double d=cur[i].c-cur[i-].c;
if(d<0.0000001) continue;
po now=cur[i-].P;
int tmp=-;
while(tmp==-){
double z=d*sui();
now=cur[i-].P.xuan(z);
tmp=in(now);
}
if(tmp==){
ret+=d;
}
}
return ret; }
int main(){
srand((unsigned long long)new char);
cin>>n>>m;
for(reg i=;i<=n;++i){
double x,y;
scanf("%lf%lf",&x,&y);
q[i]=po(x,y);
}
for(reg i=;i<=m;++i){
double x,y;
scanf("%lf%lf",&x,&y);
p[i]=po(x,y);
}
for(reg i=;i<=m;++i){
int nxt=(i==m)?:i+;
l[i].A=p[i];l[i].B=p[nxt];
if(p[i].x>p[nxt].x||(p[i].x==p[nxt].x&&p[i].y>p[nxt].y)) swap(l[i].A,l[i].B); if(p[i].x==p[nxt].x){
l[i].k=inf;
}else{
l[i].k=(p[nxt].y-p[i].y)/(p[nxt].x-p[i].x);
l[i].b=((p[nxt].x*p[i].y)-(p[i].x*p[nxt].y))/(p[nxt].x-p[i].x);
}
} double ans=0.0;
for(reg i=;i<=n;++i){
ans+=calc(q[i]);
}
ans=ans/(*Pi);
printf("%.5lf",ans);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

LOJ#6437. 「PKUSC2018」PKUSC的更多相关文章

  1. loj#6437. 「PKUSC2018」PKUSC(计算几何)

    题面 传送门 题解 计算几何的东西我好像都已经忘光了-- 首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案.求 ...

  2. 【LOJ】#6437. 「PKUSC2018」PKUSC

    题解 我们把这个多边形三角形剖分了,和统计多边形面积一样 每个三角形有个点是原点,把原点所对应的角度算出来,记为theta 对于一个点,相当于半径为这个点到原点的一个圆,圆弧上的弧度为theta的一部 ...

  3. [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC

    [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC 试题描述 九条可怜是一个爱玩游戏的女孩子. 最近她在玩一个无双割草类的游戏,平面上有 \(n\) 个敌人,每一个敌人的坐标为 ...

  4. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  5. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  6. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

  7. Loj#6434「PKUSC2018」主斗地(搜索)

    题面 Loj 题解 细节比较多的搜索题. 首先现将牌型暴力枚举出来,大概是\(3^{16}\)吧. 然后再看能打什么,简化后无非就三种决策:单牌,\(3+x\)和\(4+x\). 枚举网友打了几张\( ...

  8. Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)

    题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_ ...

  9. Loj#6432「PKUSC2018」真实排名(二分查找+组合数)

    题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...

随机推荐

  1. 支付宝支付接口-app支付沙箱环境

    说明 开发阶段 需要验证自己的app支付加签是否正确,这里使用沙箱环境来进行模拟,使用ali的沙箱测试app和沙箱钱包app进行校验 准备阶段 1.进入沙箱页面 2.找到app支付文档 https:/ ...

  2. Hadoop–Task 相关

    在MapReduce计算框架中,一个应用程序被划分为Map和Reduce两个计算阶段.他们分别由一个或多个Map Task 和Reduce Task组成. Map Task: 处理输入数据集合中的一片 ...

  3. mysqld_safe A mysqld process already exists

    最近修改mysql密码遇到mysqld_safe A mysqld process already exists问题: 解决步骤: 1:ps aux |grep mysql   查看mysql的进程. ...

  4. delphi 注册表

    Delphi中定义了一个Tregistry类,通过使用这个类中封装的很多有关对注册表操作的方法和属性可以完成对注册表的操作.1. 在注册表中创建一个新的关键字Tregistry类中有一个CreateK ...

  5. VS卸载不干净,再次安装盘符不能更改问题(转载)

    下载文件,直接用. 链接:https://pan.baidu.com/s/1K1cbJUq_JC9DN2MoE6Z3RA 密码:cuad

  6. xcode5 添加Build Phases脚本

    http://www.runscriptbuildphase.com/ 版权声明:本文为博主原创文章,未经博主允许不得转载.

  7. Unity3D中的线程与协程

    线程 Unity3D是以生命周期主线程循环进行游戏开发. Unity3D中的子线程无法运行Unity SDK(开发者工具包,软件包.软件框架)跟API(应用程序编程接口,函数库). 限制原因:大多数游 ...

  8. D语言简介

    D语言,一种通用计算机程序语言,威力强大.功能丰富,支持多种编程范式,例如面向对象.[1]  D语言最初由Digital Mars公司就职的Walter Bright于2001年发布,意图改进C++语 ...

  9. Cortex-M3的异常/中断屏蔽寄存器组

    转自 1. Cortex-M3的异常/中断屏蔽寄存器组 注:只有在特权级下,才允许访问这3个寄存器. 名 字 功能描述 PRIMASK 只有单一比特的寄存器.置为1后,就关掉所有可屏蔽异常,只剩下NM ...

  10. Tomcat下载部署及解决中文乱码显示

    一.下载 tomcat下载链接:https://tomcat.apache.org/ 1.进入tomcat官网后,我使用的是tomcat9,所以我选择tomcat9.然后点击core下的zip包下载. ...