「PKUSC2018」PKUSC
传送门
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的更多相关文章
- [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC
[LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC 试题描述 九条可怜是一个爱玩游戏的女孩子. 最近她在玩一个无双割草类的游戏,平面上有 \(n\) 个敌人,每一个敌人的坐标为 ...
- 【LOJ】#6437. 「PKUSC2018」PKUSC
题解 我们把这个多边形三角形剖分了,和统计多边形面积一样 每个三角形有个点是原点,把原点所对应的角度算出来,记为theta 对于一个点,相当于半径为这个点到原点的一个圆,圆弧上的弧度为theta的一部 ...
- loj#6437. 「PKUSC2018」PKUSC(计算几何)
题面 传送门 题解 计算几何的东西我好像都已经忘光了-- 首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案.求 ...
- LOJ6437. 「PKUSC2018」PKUSC [计算几何]
LOJ 思路 显然多边形旋转可以变成点旋转,不同的点的贡献可以分开计算. 然后就变成了要求一个圆在多边形内的弧长. 考虑把交点全都求出来,那么两个交点之间的状态显然是相同的,可以直接把圆弧上的中点的状 ...
- LOJ#6437. 「PKUSC2018」PKUSC
题面 题意转化为: 判断每个点所在的圆有多长的弧度角位于多边形内部. 然后就很暴力了. 每个点P,直接找到多边形和这个圆的所有交点,按照距离P的角度排序. 找交点,直接联立二元二次方程组.... 需要 ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
- LOJ #6435. 「PKUSC2018」星际穿越(倍增)
题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...
- LOJ #6432. 「PKUSC2018」真实排名(组合数)
题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...
- 「PKUSC2018」星际穿越 (70分做法)
5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 27 Solved: 11[Submit][Status] ...
随机推荐
- flutter_screenutil
import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; ...
- 【JVM】记录一次线上SWAP偏高告警的故障分析过程
近期遇到一个堆外内存导致swap飙高的问题,这类问题比较罕见,因此将整个排查过程记录下来了 现象描述 最近1周线上服务器时不时出现swap报警(swap超过内存10%时触发报警,内存是4G,因此swa ...
- unity shader入门(二)语义,结构体,逐顶点光照
下为一个逐顶点漫反射光照shader Shader "study/Chapter6/vertexShader"{ Properties{_Diffuse("Diffuse ...
- python私有工具库小结
1.一些试用py工具清单 https://www.zhihu.com/question/60402355/answer/752917744?utm_source=wechat_session& ...
- 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
[方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学 ...
- Mysql 整数类型的字段的属性设置及常用的函数
数据类型 二.MySQL支持的数据类型 数值类型.日期类型.字符串类型 1.数值类型 1)整数类型 tinyint.smallint.mediumint.int和bigint 2)zerofill属性 ...
- 浅谈HTTP中Get与Post的区别【转】
转自http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html#commentform 感谢LZ分享 Http定义了与服务器交互的不同方法 ...
- glfw之hello world
mac上用cocoa做imshow,资料似乎不好找,即便找到也需要和OC混编,而不是纯C.这不够纯粹.考虑用opengl做通用的.跨平台的imshow.先入门一下opengl,从glfw官方例子入手. ...
- Linux 系统安全相关
本篇关于Linux的一些安全知识,主要就是与账号相关的安全. 账户文件锁定 当服务器中的用户账号已经固定,不在进行更改,可锁定账户文件.锁定后,无法添加.删除账号,也无法更改密码等. 锁定账户文件 c ...
- MSSQL-反弹注入
工具:香港云免费云服务器:http://www.webweb.com 注册使用匿名邮箱:https://bccto.me/ 香港云服务器搭建MSSQL数据库,并建表admin,字段数要大于等于我们想要 ...