LOJ#6437. 「PKUSC2018」PKUSC
题意转化为:
判断每个点所在的圆有多长的弧度角位于多边形内部。
然后就很暴力了。
每个点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的更多相关文章
- loj#6437. 「PKUSC2018」PKUSC(计算几何)
题面 传送门 题解 计算几何的东西我好像都已经忘光了-- 首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案.求 ...
- 【LOJ】#6437. 「PKUSC2018」PKUSC
题解 我们把这个多边形三角形剖分了,和统计多边形面积一样 每个三角形有个点是原点,把原点所对应的角度算出来,记为theta 对于一个点,相当于半径为这个点到原点的一个圆,圆弧上的弧度为theta的一部 ...
- [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC
[LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC 试题描述 九条可怜是一个爱玩游戏的女孩子. 最近她在玩一个无双割草类的游戏,平面上有 \(n\) 个敌人,每一个敌人的坐标为 ...
- 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」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...
- Loj#6434「PKUSC2018」主斗地(搜索)
题面 Loj 题解 细节比较多的搜索题. 首先现将牌型暴力枚举出来,大概是\(3^{16}\)吧. 然后再看能打什么,简化后无非就三种决策:单牌,\(3+x\)和\(4+x\). 枚举网友打了几张\( ...
- Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)
题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_ ...
- Loj#6432「PKUSC2018」真实排名(二分查找+组合数)
题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...
随机推荐
- 2018-6-17-win10-UWP-全屏
title author date CreateTime categories win10 UWP 全屏 lindexi 2018-06-17 17:51:19 +0800 2018-2-13 17: ...
- vue生态系统之vuex
一.webpack生成项目 1.webpack 在需要建立项目的目录中进行初始化项目 E:\vueProject>vue init webpack vuexpj ? Project name v ...
- vue $emit 子传父
我们使用子组件传递值给父组件使用 $emit 代码 <!DOCTYPE html> <html lang="en"> <head> <me ...
- 47. List中特有的方法
集合的体系:--------------| Collection 单列集合的根接口----------| List 如果实现了List接口的集合类,该类具备的特点是:有序,可重复---------- ...
- Razor页面之添加TagHelper
1.右键项目-----添加------新建项 2.创建Razor试图导入 (Razor View Imports) 3.在创建的_ViewImports.cshtml中添加 @AddTagHelpe ...
- __init__初始化方法
使用场景:多个对象(由同一个类产生)的属性同名且值都一样,这时就需要使用init()方法. # 多个对象(由同一个类产生)的属性同名且值都一样,这时就需要使用__init__()方法. # class ...
- springMVC快速入门 共分为五步
springMVC快速入门 共分为5步分别为: 1 导入依赖 2 spring-mvc.xml 配置 3 web.xml配置 4 自定义一个核心控制类 5 页面配置 详细步骤以及代码 ...
- thinkphp 输入过滤
永远不要相信客户端提交的数据,所以对于输入数据的过滤势在必行,我们建议: 开启令牌验证避免数据的重复提交: 使用自动验证和自动完成机制进行初步过滤: 使用系统提供的I函数获取用户输入数据: 对不同的应 ...
- C++从string中删除所有的某个特定字符【转载】
转载自https://www.cnblogs.com/7z7chn/p/6341453.html C++中要从string中删除所有某个特定字符, 可用如下代码 str.erase(std::remo ...
- faster-rcnn代码阅读-rpn-data层
这一节讲述rpn-data层,和这一层有关的结构图如下: rpn-data层的prototxt定义如下: layer { name: 'rpn-data' type: 'Python' bottom: ...