「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] ...
随机推荐
- AWS--Lamdba
分享一个Lambda相关的连接 https://blog.csdn.net/m0_37204491/article/details/72829477
- JAVA案例练习: 去除ArrayList中重复的字符串(字符串内容相同),去除重复的对象
package com.yqw.list; import java.util.ArrayList;import java.util.Iterator; public class Demo_ArrayL ...
- pandas-02 Series()和DataFrame()的区别与联系
pandas-02 Series()和DataFrame()的区别与联系 区别: series,只是一个一维数据结构,它由index和value组成. dataframe,是一个二维结构,除了拥有in ...
- Linux中打开文件显示行号相关命令
一.显示行号 :set number 或 :set nu 二.取消显示行号 :set nu! 三.每次打开显示行号 修改vi ~/.vimrc 文件,添加:set number
- 关于Python学习之 列表与字典
列表 列表是Python中最具灵活性的有序集合对象类型. # 列表迭代和解析 >>> res = [c*4 for c in 'Spam'] >>> res ['S ...
- ar 解压一个.a文件报错: xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
Linux 使用终端指令 ar x /Users/apple/Desktop/libWC_LIB_SDKT.a解压一个文件 报错如图所示: 是因为该.a文件包含了多个cpu架构,比如armv7,ar ...
- DOS命令_查询某个端口的占用情况并释放
>netstat -aon | findstr “80″Proto Local Address Foreign Address State ...
- unnitest+HtmlRunner生成测试报告
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/5/5 21:23 # @Author : ChenAdong # @emai ...
- go调度: 第二部分-go调度器
前言 这个博客是三部分中提供go调度器的语义和机制的部分. 博客三部分的顺序: 1) go调度: 第一部分-操作系统调度 2) go调度: 第二部分-go调度器 3) go调度: 第三部分-并发 介绍 ...
- 百度编译器ueditor插入视频的时候。在预览的窗口提示 “输入的视频地址有误,请检查后再试!
ueditor.all.js: 搜索me.commands["insertvideo"] 把html.push(creatInsertStr( vi.url, vi.width | ...