传送门

Solution 

考虑求每个点的贡献

等价于一个以OA长为半径的圆心为原点的圆在多边形内的弧对应的角度/\(2\pi\)

求弧度可以利用三角剖分

在原点的点要特判,采用射线法就可以了

Code 

#include <bits/stdc++.h>
#define reg register
#define ll long long
#define db double using namespace std; int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} const db eps=1e-6,Pi=acos(-1.);
const int N=1005;
int sign(db x){return ((x>eps)-(x<-eps));} struct P{
db x,y;
P(db x=0,db y=0):x(x),y(y){}
P operator+(P o){return P(x+o.x,y+o.y);}
P operator-(P o){return P(x-o.x,y-o.y);}
P operator *(db o){return P(x*o,y*o);}
P rev(){return P(-x,-y);}
db operator *(P o){return x*o.x+y*o.y;}
db operator ^(P o){return x*o.y-y*o.x;}
db mo(){return sqrt(x*x+y*y);}
db thi(P o){return acos(((*this)*o)/(mo()*o.mo()));}
}s[N],p[N]; db calc(P a,P b,db R)
{
db ras=0;
db f=sign(a^b);
if(sign(max(a.mo(),b.mo())-R)==-1) return 0; db thi=a.thi(b);
db h=fabs((a^b)/(a-b).mo());
if(sign(h-R)>-1) return thi*f; db a0=asin(h/R),a1=a.rev().thi(b-a),a2=b.rev().thi(a-b);
if(sign(a0-a1)==1) ras+=a0-a1;
if(sign(a0-a2)==1) ras+=a0-a2;
return min(ras,thi)*f;
} int chk(P x,P y)
{
if(!sign(x.y)) return sign(x.x)==1;
if(!sign(y.y)) return 0;
if(x.y>y.y) swap(x,y);
if(sign(x.y*y.y)==1) return 0;
P xxx=x+(y-x)*(x.y/(y.y-x.y));
return sign(xxx.x)==1;
} int main()
{
reg int i,j,n,m;
db ans=0.;
n=read(),m=read(); for(i=1;i<=n;++i) p[i].x=read(),p[i].y=read();
for(i=1;i<=m;++i) s[i].x=read(),s[i].y=read();
s[m+1]=s[1]; for(i=1;i<=m;++i)
{
if(!sign(s[i]^s[i+1])) continue;
for(j=1;j<=n;++j)
{
if(!sign(p[j].mo())) continue;
ans+=calc(s[i],s[i+1],p[j].mo());
}
} for(i=1;i<=n;++i)
{
if(sign(p[i].mo())) continue;
int flag=1,cnt=0;
for(j=1;j<=m;++j)
{
if(sign(s[j]^s[j+1])) cnt+=chk(s[j],s[j+1]);
else if(sign(s[j]*s[j+1])<1){flag=0;break;}
}
if(flag&&cnt%2==1) ans+=Pi*2.;
} ans/=(Pi*2.); return 0*printf("%.5lf\n",ans);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

「PKUSC2018」PKUSC的更多相关文章

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

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

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

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

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

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

  4. LOJ6437. 「PKUSC2018」PKUSC [计算几何]

    LOJ 思路 显然多边形旋转可以变成点旋转,不同的点的贡献可以分开计算. 然后就变成了要求一个圆在多边形内的弧长. 考虑把交点全都求出来,那么两个交点之间的状态显然是相同的,可以直接把圆弧上的中点的状 ...

  5. LOJ#6437. 「PKUSC2018」PKUSC

    题面 题意转化为: 判断每个点所在的圆有多长的弧度角位于多边形内部. 然后就很暴力了. 每个点P,直接找到多边形和这个圆的所有交点,按照距离P的角度排序. 找交点,直接联立二元二次方程组.... 需要 ...

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

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

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

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

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

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

  9. 「PKUSC2018」星际穿越 (70分做法)

    5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 27  Solved: 11[Submit][Status] ...

随机推荐

  1. URL不变的情况下,最实用的vue刷新当前页面,provide / inject 组合 方式实现vue页面刷新

    原文:https://blog.csdn.net/Dream_xun/article/details/83024487 其他参考:https://blog.csdn.net/liyunkun888/a ...

  2. 如何让 height:100%; 起作用---父级元素必须设定高度

    参考: http://www.webhek.com/post/css-100-percent-height.html https://www.cnblogs.com/kunmomo/p/1060066 ...

  3. jdk命令行工具系列

    虚拟机堆转储快照分析工具使用jmap等方法生成java的堆文件后jhat:虚拟机堆转储快照分析工具 导出程序执行的堆信息 jps jps -l jmap -dump:format=b,file=D:/ ...

  4. Oracle与SQL Server等数据库的区别

    Oracle与SQL Server等数据库的区别 在Oracle中提倡使用一个连接 Oracle处理多个并发语句使用一个连接,大大提升系统能支持的并发量 Oracle运行在32为单进程平台上SGA和P ...

  5. MySQL每天产生了多大容量的binlog,用SQL语句能查到吗?

    首先,这是个假设性命题(又一个钓鱼题). 这个需求完全可以通过系统层命令,配合MySQL中的"FLUSH BINARY LOGS"快速完成. 运行SHOW MASTER/BINAR ...

  6. SQL必知必会实践--mysql

    -- mysql安装 --   https://www.mysql.com/downloads/

  7. Linux环境宿主机进入Docker容器、连接数据库、复制文件

    我们默认mysql容器已经正常启动,以下为关键命令.1.docker exec -it mysql bash : 进入已经正常启动的容器bash中,mysql是指实际容器名称.2.mysql -uro ...

  8. MySQL优化整理

    一.SQL优化 1.show status查看各种sql的执行频率   SHOW STATUS 可以根据需要显示 session 级别的统计结果和 global级别的统计结果.   显示当前sessi ...

  9. Docker CMD ENTRYPOING 和Kubernetes command args对比

    Docker CMD ENTRYPOING 和Kubernetes command args对比 exec 模式 使用 exec 模式时,容器中的任务进程就是容器内的 1 号进程 shell 模式 使 ...

  10. java调用c++库

    c++ 写的库 jni封装一层 才可以给 java调用