题面

传送门

题解

计算几何的东西我好像都已经忘光了……

首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案。求总的度数是多少

因为这是个简单多边形,我们可以把它给三角形剖分。就是说把每条边都和原点构成一个三角形,然后对圆计算这个三角形的贡献,根据这条边的顺逆时针顺序来决定贡献要加上还是减去。易知最后的贡献就是这个多边形的贡献

那么我们对于每一个圆,暴力枚举多边形的一条边和原点构成的三角形,然后判一下圆弧和三角形的交就行了

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define eps 1e-3
  5. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. using namespace std;
  9. char buf[1<<21],*p1=buf,*p2=buf;
  10. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  11. int read(){
  12. R int res,f=1;R char ch;
  13. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  14. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  15. return res*f;
  16. }
  17. double readdb()
  18. {
  19. R double x=0,y=0.1,f=1;R char ch;
  20. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  21. for(x=ch-'0';(ch=getc())>='0'&&ch<='9';x=x*10+ch-'0');
  22. for(ch=='.'&&(ch=getc());ch>='0'&&ch<='9';x+=(ch-'0')*y,y*=0.1,ch=getc());
  23. return x*f;
  24. }
  25. const double Pi=acos(-1.0);const int N=505;
  26. int n,m;double ans;
  27. inline bool dcmp(const double &a,const double &b){return fabs(a-b)<eps;}
  28. struct node{
  29. double x,y;
  30. node(){}
  31. node(R double X,R double Y):x(X),y(Y){}
  32. inline node operator +(const node &b)const{return node(x+b.x,y+b.y);}
  33. inline node operator -(const node &b)const{return node(x-b.x,y-b.y);}
  34. inline node operator *(const double &b)const{return node(x*b,y*b);}
  35. inline node operator /(const double &b)const{return node(x/b,y/b);}
  36. inline double operator *(const node &b)const{return x*b.y-y*b.x;}
  37. friend double dot(const node &a,const node &b){return a.x*b.x+a.y*b.y;}
  38. inline double norm(){return sqrt(x*x+y*y);}
  39. }p[N],c[N];
  40. void calc(node a,node b,double r){
  41. int f=(a*b<0)?-1:1;
  42. if(max(a.norm(),b.norm())<r)return;
  43. double theta=acos(dot(a,b)/(a.norm()*b.norm()));
  44. double h=fabs(a*b)/(b-a).norm();
  45. if(h>=r)return ans+=theta*f,void();
  46. double beta=acos(dot(a-b,node(-b.x,-b.y))/((a-b).norm()*b.norm()));
  47. double alpha=acos(dot(b-a,node(-a.x,-a.y))/((b-a).norm()*a.norm()));
  48. double t=asin(h/r),s=0;
  49. if(t>beta)s+=t-beta;if(t>alpha)s+=t-alpha;
  50. s=min(s,theta);
  51. ans+=f*s;
  52. }
  53. bool ck(node a,node b){
  54. node c(1,0);
  55. if(a.y<b.y)swap(a,b);
  56. return c*a>0&&b*c>0&&b*a>0;
  57. }
  58. void solve(){
  59. fp(i,1,m)if(!dcmp(c[i]*c[i+1],0))
  60. fp(j,1,n)if(!dcmp(p[j].norm(),0))calc(c[i],c[i+1],p[j].norm());
  61. fp(j,1,n)if(dcmp(p[j].norm(),0)){
  62. bool flag=1;int t=0;
  63. fp(i,1,m)if(dcmp((c[i]-p[j])*(c[i+1]-p[j]),0)){
  64. if(dot(c[i]-p[j],c[i+1]-p[j])<=0){flag=0;break;}
  65. }else{
  66. if(dcmp(c[i].y,0))t+=(c[i].x>0);
  67. else t+=ck(c[i],c[i+1]);
  68. }
  69. if(flag&&(t&1))ans+=2*Pi;
  70. }
  71. ans/=2*Pi;
  72. printf("%.5lf\n",ans);
  73. }
  74. int main(){
  75. // freopen("testdata.in","r",stdin);
  76. n=read(),m=read();
  77. fp(i,1,n)p[i].x=readdb(),p[i].y=readdb();
  78. fp(i,1,m)c[i].x=readdb(),c[i].y=readdb();
  79. c[m+1]=c[1];
  80. solve();
  81. return 0;
  82. }

loj#6437. 「PKUSC2018」PKUSC(计算几何)的更多相关文章

  1. LOJ#6437. 「PKUSC2018」PKUSC

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

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

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

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

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

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

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

  5. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  6. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  7. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

  8. Loj#6434「PKUSC2018」主斗地(搜索)

    题面 Loj 题解 细节比较多的搜索题. 首先现将牌型暴力枚举出来,大概是\(3^{16}\)吧. 然后再看能打什么,简化后无非就三种决策:单牌,\(3+x\)和\(4+x\). 枚举网友打了几张\( ...

  9. Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)

    题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_ ...

随机推荐

  1. python's eighth day for me

    f : 变量,f_obj, file, f_handler,...文件句柄. open : windows 的系统功能. windows 默认编码方式:gbk.   Linux 默认编码方式:utf ...

  2. js中的requestAnimationFrame

    js中的requestAnimationFrame requestAnimationFrame的作用就是重绘 一个简单的demo如下 <!DOCTYPE html> <html la ...

  3. c#中{set;get;}使用逻辑

    (先把结论提前)下面两种定义私有变量配合公有变量的方法都没有意义,除非有特殊的逻辑需要在set或get中,其它情况都等效于 public GM_Arc Arc {set;get;} //不进行初始化, ...

  4. DataGridView根据条件给单元格绑定图片

    代码区: private void Form1_Load(object sender, EventArgs e) { myClass.mySqliteAPI conn = new myClass.my ...

  5. 将.sql文件导入powerdesigner的实现方法详解

    将.sql文件导入powerdesigner的步骤是本文我们主要要介绍的内容,步骤如下: 第一步:将要导入的库的所有表的表结构(不要表数据,只要表结构)导出成一个.sql文件. 第二步:在powerd ...

  6. [转] const T、const T*、T *const、const T&、const T*& 的区别

    这里的T指的是一种数据类型,可以是int.long.doule等基本数据类型,也可以是自己类型的类型class.单独的一个const你肯定知道指的是一个常量,但const与其他类型联合起来的众多变化, ...

  7. Unity3D Physics Keynote

    [Unity3D Physics Keynote] 1.在哪设置Layer Collision Matrix? "Edit"->"Project Settings& ...

  8. java Web jsp和servlet的关系

    JSP在本质上就是SERVLET,但是两者的创建方式不一样Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观JSP由HTML代码和JSP标签构 ...

  9. SESSION的知识

    android模拟表单用到了httpclient,但是需要了解Jsessionid的相关知识 如下是从一篇博文摘抄来的 在web应用的开发中我们会经常看到这样的url:http://www.xxx.c ...

  10. node.js中模块报错【window is not defined】的解决方法

    (function(window) { /* Keep source code the same */ // })(typeof window == "undefined" ? g ...