带劲的计算几何【这一定是我WC之前开的最后一道计几!!!

每个点画个圆然后看一下交点 然后判断是多边形内还是多边形外

这个就是取圆上中点然后射线法

eps我1e-8才过 不知道为啥有的人说只能开1e-3

写了三天带劲= =

还有注意long double!附了一组数据~

//Love and Freedom.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define eps 1e-8
#define mxn 510
#define db long double
using namespace std; const db pi = acosl(-1.0); struct poi
{
db x,y;
poi(){}
poi(db _x,db _y){x=_x,y=_y;}
}; typedef poi vec; bool operator ==(vec a,vec b){return a.x==b.x&&a.y==b.y;}
vec operator +(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
vec operator -(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
vec operator *(vec a,db b){return vec(a.x*b,a.y*b);}
db cross(vec a,vec b){return a.x*b.y-a.y*b.x;}
db value(vec a,vec b){return a.x*b.x+a.y*b.y;}
db len(vec a){return a.x*a.x+a.y*a.y;}
db ang(vec a){return atan2(a.y,a.x);} struct line
{
poi p; vec v; db ang;
line(){}
line(poi _p,poi _v)
{
p=_p; v=_v;
ang = atan2(v.y,v.x);
}
}li[mxn]; db cir[mxn]; int cnt,n,m;
poi mid[mxn]; db section(line a,line b)
{
db k = cross(a.v+a.p-b.p,a.p-b.p)/(cross(a.v+a.p-b.p,b.v)+cross(b.v,a.p-b.p));
return k;
} void get(line a,db r)
{
db c = - r*r + len(a.p);
db aa = len(a.v);
db b = 2.0*(a.v.x*a.p.x+a.v.y*a.p.y);
db delta = b*b - 4.0 * aa * c;
if(delta < 0) return ;
delta = sqrt(delta);
db k1 = (-b + delta)/(2.0*aa);
if(abs(delta)<eps)
{
poi tmp = a.p+a.v*k1;
if(k1>-eps && k1-1.0<eps) cir[++cnt] =atan2(tmp.y,tmp.x);
return;
}
db k2 = (-b-delta)/(2.0*aa);
poi tmp = a.p+a.v*k1;
if(k1>-eps && k1-1.0<eps) cir[++cnt] = atan2(tmp.y,tmp.x);
tmp = a.p+a.v*k2;
if(k2>-eps && k2-1.0<eps) cir[++cnt] = atan2(tmp.y,tmp.x);
} void put(poi a)
{
printf("p===%lf %lf\n",a.x,a.y);
} void putl(line a)
{
printf("ls--------------\n");
put(a.p); put(a.v); printf("%lf\n",a.ang);
printf("le--------------\n");
} bool between(line a,poi b)
{
int tmp=0;
if(a.v.x <= 0.0)
{
if(b.x <= a.p.x && b.x >= a.p.x+a.v.x) tmp++;
}
else
{
if(b.x >= a.p.x && b.x <= a.p.x+a.v.x) tmp++;
}
if(a.v.y <= 0.0)
{
if(b.y <= a.p.y && b.y >= a.p.y+a.v.y) tmp++;
}
else
{
if(b.y >= a.p.y && b.y <= a.p.y+a.v.y) tmp++;
}
return tmp==2;
} bool check(poi x)
{
for(int i=1;i<=m;i++)
if(between(li[i],x) && abs(cross(x-li[i].p,li[i].v))<eps)
return 0;
int cer = 0;
line tmp = line(x,poi(2794406.11,-2564800.0132));
for(int i=1;i<=m;i++)
{
db w = section(tmp,li[i]);
db ww = section(li[i],tmp);
if( ww>1.0 || ww<0.0 || w>1.0 || w<0.0)
continue;
cer++;
}
if(cer&1) return 1;
return 0;
} bool cmp(poi a,poi b)
{
return ang(a) < ang(b) || (abs(ang(a)-ang(b))<eps&& cross(a,b)>eps);
} bool same(poi a,poi b)
{
return abs(a.x-b.x)<eps && abs(a.y-b.y) <eps;
}
poi enemy[mxn],stk[mxn]; db makecircle(int id,db r)
{
cnt = 0; db ans = 0.0;
for(int i=1;i<=m;i++)
get(li[i],r);
if(!cnt)
{
if(check(enemy[id])) return 2*pi;
return 0.0;
}
sort(cir+1,cir+cnt+1);
int tot = cnt; cnt=1;
for(int i=2;i<=tot;i++)
if(abs(cir[i]-cir[i-1])>eps)
cir[++cnt] = cir[i];
cir[cnt+1] = cir[1] + 2*pi;
for(int i=1;i<=cnt;i++)
{
db theta = (cir[i] + cir[i+1]); theta = theta/2.0;
mid[i] = vec(r*cosl(theta),r*sinl(theta));
}
if(cnt==2)
{
if(check(mid[1]))
{
db ang = cir[2] - cir[1];
ans += ang;
}
return ans;
}
for(int i=1;i<=cnt;i++)
{
if(check(mid[i]))
{
db ang = cir[i+1] - cir[i];
ans += ang;
}
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%Lf%Lf",&enemy[i].x,&enemy[i].y);
for(int i=1;i<=m;i++)
scanf("%Lf%Lf",&stk[i].x,&stk[i].y);
for(int i=1;i<m;i++)
li[i]=line(stk[i],stk[i+1]-stk[i]);
li[m] = line(stk[m],stk[1]-stk[m]);
db full,r,ans=0.0;
for(int i=1;i<=n;i++)
{
r = sqrtl(len(enemy[i]));
if(r<eps)
{
if(check(poi(0,0))) ans += 1.00000;
continue;
}
full = 2*pi;
ans += makecircle(i,r)/full;
}
printf("%.5Lf\n",ans);
return 0;
}
/**
1 7
1 1
2 1
-1 -1
-1 1
1 1
1 2
3 1
2 -1
*/

LOJ6437 PKUSC2018 PKUSC的更多相关文章

  1. 【loj6437】 【PKUSC2018】 PKUSC 计算几何

    题目大意:给你一个m个点的简单多边形.对于每个点i∈[1,n],作一个以O点为原点且过点i的圆,求该圆在多边形内的圆弧长度/圆长. 其中n≤200,m≤500. 我们将n个点分开处理. 首先,我们要判 ...

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

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

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

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

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

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

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

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

  6. [LOJ6437]PKUSC

    旋转多边形是没有前途的,我们考虑旋转敌人,那么答案就是所有人的可行区间长度之和除以$2\pi$ 首先对每个敌人找到那些旋转后会落到多边形上的角度,实际上就是圆和一些线段求交,解方程即可,注意判一下落在 ...

  7. 「PKUSC2018」PKUSC

    传送门 Solution  考虑求每个点的贡献 等价于一个以OA长为半径的圆心为原点的圆在多边形内的弧对应的角度/\(2\pi\) 求弧度可以利用三角剖分 在原点的点要特判,采用射线法就可以了 Cod ...

  8. LOJ#6437. 「PKUSC2018」PKUSC

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

  9. 【LOJ6436】【PKUSC2018】神仙的游戏(NTT)

    [LOJ6436][PKUSC2018]神仙的游戏(NTT) 题面 LOJ 题解 看到\(zsy\)从\(PKUSC\)回来就秒掉了这种神仙题 吓得我也赶快看了看\(PKUSC\)都有些什么神仙题 然 ...

随机推荐

  1. luoguP3806 【模板】点分治1

    #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define ...

  2. webService接口的py文件打包成exe

    (一)webService接口的py文件打包成exe,在python3.5版本.pyInstaller3.2版本.pywin32-219.win-amd64-py3.5版本打包时报错,原因可能是pyi ...

  3. ASP.NET-配置Dubug和Release生成不同的Web.config

    配置 Dubug 和 Release 生成不同的 Web.config Web.config Transformation Syntax for Web Application Project Dep ...

  4. Angular.js路由 简单小案例

    代码案例: <html> <head> <meta charset="utf-8"> <title>AngularJS 路由实例&l ...

  5. day15—jQuery UI之widgets插件

    转行学开发,代码100天——2018-03-31 今天学习了jQuery UI的widgets插件,主要包括accordion插件 accordion插件 该插件表示折叠面板效果,点击头部展开/折叠被 ...

  6. 深入理解Redis的持久化机制和原理

    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...

  7. UML 类图快速入门

    UML 图形 官方定义 UML 类图(Class Diagram) UML 时序图(Sequence Diagram) 领域 UML 类图和实现 UML 类图 领域 UML 类图 实现 UML 类图 ...

  8. Card Collector AtCoder - 5168(二分图匹配的HALL定理)

    题意: 给定一个H行W列的矩阵,在矩阵的格点上放带权值的卡片(一个点上能放多张). 现在从每行每列各拿走一张卡片(没有可以不拿),求可以拿到的最大权值. 卡片数N<=1e5,H,W<=1e ...

  9. Spring MVC浅析

    讲到MVC,想必大家都很熟悉,就是将数据模型.视图.控制器进行分离,做到分工明确,在Spring的帮助下,Spring MVC 更是做到了充分的解耦,因为大部分的资源都由Spring进行管理,为Spr ...

  10. 模拟赛毒瘤状压DP题:Kronican

    Kronican 内存限制:32 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: cqbzgm 题目描述 Mislav有N个无限体积的杯子,每一个杯子中都 ...