[LOJ6437]PKUSC
旋转多边形是没有前途的,我们考虑旋转敌人,那么答案就是所有人的可行区间长度之和除以$2\pi$
首先对每个敌人找到那些旋转后会落到多边形上的角度,实际上就是圆和一些线段求交,解方程即可,注意判一下落在多边形端点上的情况
把角度排序,每相邻两个角度构成一个区间,在区间内随便取一个角度,把敌人旋转这个角度,判断敌人是否在多边形内,如果是那么整个区间都是可行的
旋转直接套公式:$\left[\matrix{x'\\y'}\right]=\left[\matrix{\cos\theta&-\sin\theta\\\sin\theta&\cos\theta}\right]\left[\matrix{x\\y}\right]$
判断点是否在多边形内:考虑站在这个点,按顺序望向多边形的每个顶点,如果转了$2\pi$弧度就在多边形里,如果转了$0$弧度就在多边形外
注意精度,算夹角时绝对不要用asin或acos,对判别式判断大小不能用eps
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; typedef double du; const du eps=1e-9,pi2=2*M_PI; bool equ(du a,du b){return fabs(a-b)<eps;} bool lt(du a,du b){return a-b<-eps;} bool inr(du a,du b,du c){ if(a>c)swap(a,c); return lt(a,b)&<(b,c); } struct point{ du x,y; point(du a=0,du b=0){x=a;y=b;} }; point operator-(point a,point b){return point(a.x-b.x,a.y-b.y);} du dot(point a,point b){return a.x*b.x+a.y*b.y;} du cr(point a,point b){return a.x*b.y-a.y*b.x;} du len(point a){return sqrt(a.x*a.x+a.y*a.y);} du dif(point a,point b){ if(equ(len(a)*len(b),0))return 0; if(equ(cr(a,b),0))return lt(0,dot(a,b))?0:-M_PI; du f=atan2(b.y,b.x)-atan2(a.y,a.x); if(lt(cr(a,b),0)){ if(lt(0,f))f-=pi2; }else if(lt(f,0)) f+=pi2; return f; } void eq2(du a,du b,du c,du&d,du&x1,du&x2){ d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); } } du ang[1010]; int M; void chk(point u,point a,point b){ du x1,x2,r; r=len(u); if(equ(r,len(a)))ang[++M]=dif(u,a); if(equ(a.x,b.x)){ if(lt(r,a.x))return; x1=sqrt(r*r-a.x*a.x); x2=-x1; if(inr(a.y,x1,b.y))ang[++M]=dif(u,point(a.x,x1)); if(inr(a.y,x2,b.y))ang[++M]=dif(u,point(a.x,x2)); }else{ du d,K,B; K=(b.y-a.y)/(b.x-a.x); B=a.y-K*a.x; eq2(K*K+1,2*K*B,B*B-r*r,d,x1,x2); if(d<0)return; if(inr(a.x,x1,b.x))ang[++M]=dif(u,point(x1,K*x1+B)); if(inr(a.x,x2,b.x))ang[++M]=dif(u,point(x2,K*x2+B)); } } point e[210],p[510]; int n,m; #define gao(b,c) if(equ(cr(u-b,u-c),0))return 0;\ t+=dif(b-u,c-u); bool inside(point u){ du t=0; int i; for(i=1;i<m;i++){ gao(p[i],p[i+1]) } gao(p[m],p[1]) return equ(t,pi2); } point rot(point a,du ang){ return point(a.x*cos(ang)-a.y*sin(ang),a.x*sin(ang)+a.y*cos(ang)); } #define chk2(a,b,c) if(inside(rot(a,(b+c)*.5)))ans+=(c-b)/pi2; int main(){ int i,j; du ans; scanf("%d%d",&n,&m); for(i=1;i<=n;i++)scanf("%lf%lf",&e[i].x,&e[i].y); for(i=1;i<=m;i++)scanf("%lf%lf",&p[i].x,&p[i].y); ans=0; for(i=1;i<=n;i++){ M=0; for(j=1;j<m;j++){ chk(e[i],p[j],p[j+1]); } chk(e[i],p[m],p[1]); if(M<2){ if(inside(e[i]))ans+=1; }else{ sort(ang+1,ang+M+1); for(j=1;j<M;j++){ chk2(e[i],ang[j],ang[j+1]) } chk2(e[i],ang[M],ang[1]+pi2) } } printf("%.5lf",ans); }
[LOJ6437]PKUSC的更多相关文章
- 【loj6437】 【PKUSC2018】 PKUSC 计算几何
题目大意:给你一个m个点的简单多边形.对于每个点i∈[1,n],作一个以O点为原点且过点i的圆,求该圆在多边形内的圆弧长度/圆长. 其中n≤200,m≤500. 我们将n个点分开处理. 首先,我们要判 ...
- LOJ6437. 「PKUSC2018」PKUSC [计算几何]
LOJ 思路 显然多边形旋转可以变成点旋转,不同的点的贡献可以分开计算. 然后就变成了要求一个圆在多边形内的弧长. 考虑把交点全都求出来,那么两个交点之间的状态显然是相同的,可以直接把圆弧上的中点的状 ...
- LOJ6437 PKUSC2018 PKUSC
带劲的计算几何[这一定是我WC之前开的最后一道计几!!! 每个点画个圆然后看一下交点 然后判断是多边形内还是多边形外 这个就是取圆上中点然后射线法 eps我1e-8才过 不知道为啥有的人说只能开1e- ...
- [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC
[LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC 试题描述 九条可怜是一个爱玩游戏的女孩子. 最近她在玩一个无双割草类的游戏,平面上有 \(n\) 个敌人,每一个敌人的坐标为 ...
- PKUSC 2018 题解
PKUSC 2018 题解 Day 1 T1 真实排名 Link Solution 考虑对于每一个人单独算 每一个人有两种情况,翻倍和不翻倍,他的名次不变等价于大于等于他的人数不变 设当前考虑的人的成 ...
- [LOJ 6435][PKUSC 2018]星际穿越
[LOJ 6435][PKUSC 2018]星际穿越 题意 给定 \(n\) 个点, 每个点与 \([l_i,i-1]\) 之间的点建立有单位距离的双向边. \(q\) 组询问从 \(x\) 走到 \ ...
- [LOJ 6433][PKUSC 2018]最大前缀和
[LOJ 6433][PKUSC 2018]最大前缀和 题意 给定一个长度为 \(n\) 的序列, 求把这个序列随机打乱后的最大前缀和的期望乘以 \(n!\) 后对 \(998244353\) 取膜后 ...
- [LOJ 6432][PKUSC 2018]真实排名
[LOJ 6432][PKUSC 2018]真实排名 题意 给定 \(n\) 个选手的成绩, 选中其中 \(k\) 个使他们的成绩翻倍. 对于每个选手回答有多少种方案使得他的排名不发生变化. \(n\ ...
- Diary -「PKUSC 2021」游记
出游回来自然而然(?)地进入生产低谷的兔子只能写写游记了 qwq. Day -1 实时反馈赛制不是为防止你被数据调戏,而是给你调戏数据的机会. --鲁迅 PKU 一贯的 \(32\) 发提交实 ...
随机推荐
- Android开发注意点小记
暂时主要讨论以下几点: Android引用外部包,报NoClassDefFoundError异常崩溃 同名包引用关系问题 程序图标 9patch图片素材 Android引用外部包,程序报java.la ...
- 十个迅速提升JQuery性能的技巧
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
- WebKit学习资源
1.http://blog.csdn.net/dlmu2001/article/category/741748 红心地瓜 2.http://blog.csdn.net/cnnzp/article ...
- 在Ubuntu下编译WebKit源码--qt
转载自:http://www.cnblogs.com/panderen/archive/2011/10/18/2216154.html 在朋友的介绍下有幸認识了WebKit这个让人心动的开源浏览器内核 ...
- php getimagesize()函数获取图片宽度高度
//php自带函数 getimagesize() $img_info = getimagesize('tomener.jpg'); echo '<pre>'; print_r($img_i ...
- spring aop与aspectj
AOP:面向切面编程 简介 AOP解决的问题:将核心业务代码与外围业务(日志记录.权限校验.异常处理.事务控制)代码分离出来,提高模块化,降低代码耦合度,使职责更单一. AOP应用场景: 日志记录.权 ...
- a标签的download属性简介
最近在工作中需要一个前端直接下载静态文件的需求,之前有粗略的了解过a标签的download属性,通过download和href属性可以实现文件的下载. 简介 HTML <a> 元素 (或锚 ...
- sql注入预防
在我们登陆验证时会发现sql注入的现象. 1.sql注入发生原因 因为如果用户在用户名上输入的是' or 1=1 # 时,我们得到的sql语句是select * from shop_user wher ...
- Linux XZ格式的解压
xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 我是在下载phpmyadmin的时候看到这种压缩格式的,phpm ...
- SEH
@author: dlive SEH是Windows的异常处理机制,在程序源代码中使用__try,__catch,__finally关键字来具体实现. 但SEH与C++的try, catch异常处理不 ...