题目链接

半平面交,注意直线方向!!!

对于凸包上任意一条边$LINE(p_i,p_{i+1})$都有$S_{\Delta{p_i} {p_{i + 1}}p} < S_{\Delta{p_0} {p_1}p}$

如果我们用叉积来算面积:

$P=(x,y)$

$A=p_0=(x_1,y_1)$

$B=p_1=(x_2,y_2)$

$C=p_{i+1}=(x_3,y_3)$(至于为什么是C为i+1而不是D为i+1,画画图就知道了)

$D=p_i=(x_4,y_4)$

就有不等式:

$(x-x_2,y-y_2)(x-x_1,y-y_1)\leqslant(x-x_3,y-y_3)(x-x_4,y-y_4)$

$\Rightarrow$

$(x-x_2)(y-y_1)-(y-y_2)(x-x_1) \leqslant (x-x_3)(y-y_4)-(y-y_3)(x-x_4)$

$\Rightarrow$

$(-y_1+y_2-y_3-y_4)x+(x_1-x_2+x_3-x_4)y+$$(x_2\times y_1-y_2\times x_1)+(x_4\times y_3-y_4\times x_3) \leqslant 0$

$\Rightarrow$

$(-y_1+y_2-y_3-y_4)x+(x_1-x_2+x_3-x_4)y+\overrightarrow B\times\overrightarrow A+\overrightarrow D\times \overrightarrow C\leqslant 0$

就得到了一个半平面

交一交即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<string>
  7. #include<cstring>
  8. #include<set>
  9. #include<queue>
  10. #define op operator
  11. #define re(i,l,r) for(int i=(l);i<=(r);i++)
  12. #define rre(i,r,l) for(int i=(r);i>=(l);i--)
  13. using namespace std;
  14. template <typename Q>
  15. void inin(Q &ret)
  16. {
  17. ret=;int f=;char ch=getchar();
  18. while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
  19. while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  20. ret=f?-ret:ret;
  21. }
  22. int shurux,shuruy;
  23. const double eps=1e-;
  24. int dcmp(const double &x){return abs(x)<eps?:x<?-:;}
  25. const double pi=acos(-);
  26. const double f(const double &a){return a*a;}
  27. struct xl
  28. {
  29. double x,y;
  30. xl(double x=,double y=):x(x),y(y){}
  31. void in(){inin(shurux),inin(shuruy);x=shurux,y=shuruy;}
  32. bool op < (const xl &rhs)const {return x==rhs.x?y<rhs.y:x<rhs.x;}
  33. xl op + (const double &rhs)const {return xl(x+rhs,y+rhs);}
  34. xl op - (const double &rhs)const {return xl(x-rhs,y-rhs);}
  35. xl op * (const double &rhs)const {return xl(x*rhs,y*rhs);}
  36. xl op / (const double &rhs)const {return xl(x/rhs,y/rhs);}
  37. xl op + (const xl &rhs)const {return xl(x+rhs.x,y+rhs.y);}
  38. xl op - (const xl &rhs)const {return xl(x-rhs.x,y-rhs.y);}
  39. double angle()const {return atan2(y,x);}
  40. double len()const {return sqrt(f(x)+f(y));}
  41. };
  42. double D_(const xl &a,const xl &b){return a.x*b.x+a.y*b.y;}
  43. double X_(const xl &a,const xl &b){return a.x*b.y-a.y*b.x;}
  44. double dis(const xl &a,const xl &b){return sqrt(f(a.x-b.x)+f(a.y-b.y));}
  45. double dis2(const xl &a,const xl &b){return (a.x-b.x)*(a.x+b.x)+f(a.y-b.y);}
  46. double angle(const xl &a,const xl &b){return acos(D_(a,b)/a.len()/b.len());}
  47. struct LINE
  48. {
  49. xl u,v;double rad;
  50. LINE(xl u=xl(,),xl v=xl(,)):u(u),v(v){}
  51. void js(){rad=(v-u).angle();}
  52. bool op < (const LINE &rhs)const {return rad<rhs.rad;}
  53. };
  54. xl p[],ch[];
  55. LINE a[],b[];
  56. bool onleft(const xl &a,const LINE &l){return dcmp(X_(l.v-l.u,a-l.u))>;}
  57. LINE getline2(xl C,xl D)
  58. {
  59. xl A=p[],B=p[];
  60. // if(D_(B-A,D-C)<0)swap(C,D);
  61. double a=(-A.y+B.y-C.y+D.y),b=(A.x-B.x+C.x-D.x),c=X_(B,A)+X_(D,C);
  62. LINE ret(xl(,-c/b),xl(,(-c-a)/b));
  63. if(!dcmp(b))ret=LINE(xl(-c/a,),xl((-c-b)/a,));
  64. if(!onleft(p[],ret)&&!onleft(p[],ret))swap(ret.u,ret.v);
  65. return ret;
  66. }
  67. LINE getline(xl C,xl D)
  68. {
  69. LINE l=getline2(C,D);
  70. int wocao1=onleft(p[],l)|onleft(p[],l);
  71. int wocao2=onleft(C,l)|onleft(D,l);
  72. if(wocao1^wocao2)return l;
  73. else return getline2(D,C);
  74. }
  75. xl getjd(const LINE &a,const LINE &b)
  76. {
  77. xl u=a.u-b.u,v1=a.v-a.u,v2=b.v-b.u;
  78. double t=X_(v2,u)/X_(v1,v2);
  79. return a.u+v1*t;
  80. }
  81. int n,nn;
  82. bool halfplanej(LINE *l)
  83. {
  84. re(i,,n-)l[i].rad=(l[i].v-l[i].u).angle();
  85. sort(l,l+n);
  86. int ll=,rr=;
  87. xl p[n];LINE b[n];b[]=l[];
  88. re(i,,n-)
  89. {
  90. while(ll<rr&&!onleft(p[rr-],l[i]))rr--;
  91. while(ll<rr&&!onleft(p[ll],l[i]))ll++;
  92. b[++rr]=l[i];
  93. if(!dcmp(X_(b[rr].v-b[rr].u,b[rr-].v-b[rr-].u)))
  94. {
  95. rr--;
  96. if(onleft(l[i].u,b[rr]))b[rr]=l[i];
  97. }
  98. if(ll<rr)p[rr-]=getjd(b[rr-],b[rr]);
  99. }
  100. while(ll<rr&&!onleft(p[rr-],b[ll]))rr--;
  101. if(rr-ll<=)return ;
  102. p[rr]=getjd(b[rr],b[ll]);
  103. re(i,ll,rr)ch[nn++]=p[i];
  104. ch[nn]=ch[];return ;
  105. }
  106. double zongarea,yaoarea;
  107. int main()
  108. {
  109. inin(n);
  110. re(i,,n-)p[i].in();
  111. p[n]=p[];
  112. xl temp=p[]-p[];
  113. re(i,,n-)zongarea+=abs(X_(temp,p[i+]-p[i])),temp=temp+(p[i+]-p[i]);
  114. a[]=LINE(p[],p[]);
  115. re(i,,n-)
  116. a[i]=getline2(p[i+],p[i]);
  117. halfplanej(a);
  118. temp=ch[]-ch[];
  119. re(i,,nn-)
  120. yaoarea+=abs(X_(temp,ch[i+]-ch[i])),temp=temp+(ch[i+]-ch[i]);
  121. printf("%.4f",yaoarea/zongarea);
  122. return ;
  123. }

bzoj4445 小凸想跑步的更多相关文章

  1. 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交

    [BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...

  2. 【BZOJ4445】[SCOI2015]小凸想跑步(半平面交)

    [BZOJ4445][SCOI2015]小凸想跑步(半平面交) 题面 BZOJ 洛谷 题解 首先把点给设出来,\(A(x_a,y_a),B(x_b,y_b),C(x_c,y_c),D(x_d,y_d) ...

  3. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  4. Loj 2008 小凸想跑步

    Loj 2008 小凸想跑步 \(S(P,p_0,p_1)<S(P,p_i,p_{i+1})\) 这个约束条件对于 \(P_x,P_y\) 是线性的,即将面积用向量叉积表示,暴力拆开,可得到 \ ...

  5. loj #2008. 「SCOI2015」小凸想跑步

    #2008. 「SCOI2015」小凸想跑步   题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...

  6. 【bzoj4445 scoi2015】小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 nn 边形, nn 个顶点按照逆时针从 00 ∼ n - 1n−1 编号.现在小凸随机站在操场中的某个位置,标 ...

  7. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

  8. BZOJ 4445 [Scoi2015]小凸想跑步:半平面交

    传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...

  9. BZOJ4445 SCOI2015小凸想跑步(半平面交)

    考虑怎样的点满足条件.设其为(xp,yp),则要满足(x0-xp,y0-yp)×(x1-xp,y1-yp)<=(xi-xp,yi-yp)×(xi+1-xp,yi+1-yp)对任意i成立.拆开式子 ...

随机推荐

  1. Python3学习之路~5.2 time & datetime模块

    time模块 时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2014-11-11 11:11, ...

  2. Fast-R-CNN

    基于R-CNN和SPP-Net思想,RBG提出了Fast-R-CNN算法.如果选用VGG16网络进行特征提取,在训练阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升9倍和3倍: ...

  3. 【Python】-NO.99.Note.4.Python -【Python3 条件语句 循环语句】

    1.0.0 Summary Tittle:[Python]-NO.99.Note.4.Python -[Python3 条件语句 循环语句] Style:Python Series:Python Si ...

  4. AOP 入门

    1,源码 Application.java package com.bf; import org.springframework.context.ApplicationContext; import ...

  5. docker 在宿主机上根据进程PID查找归属容器ID

    在使用docker时经常出现一台docker主机上跑了多个容器,可能其中一个容器里的进程导致了整个宿主机load很高,其实一条命令就可以找出罪魁祸首 #查找容器ID docker inspect -f ...

  6. zabbix 自定义监控文本内容

    需求:监控服务器硬盘使用率是否有超过80%的 需要监控的文本 root@zabbix zabbix]# cat /etc/zabbix/scripts/data/monitor_disk.txt &q ...

  7. mybatis运行原理

    mybatis运行原理 运行过程中涉及到的类或者接口 Resources(c) :用于加载mybatis核心配置文件 XMLConfigBuilder(c) :用于解析xml文件(核心配置文件) Co ...

  8. mysql----------局域网数据库:如何让navicat链接局域网其他的数据库。

    1.找到被链接的数据库,打开以后有一个自带的mysql数据库,打开以后下面有一个user表,把里面的第一条数据的第一个字段改成% 百分号,然后保存,重启数据库,搞定 2.如果是linux下的话,记得把 ...

  9. LeetCode141.环形链表

    给定一个链表,判断链表中是否有环. 进阶:你能否不使用额外空间解决此题? /** * Definition for singly-linked list. * class ListNode { * i ...

  10. .NET 黑魔法 - 自定义日志扩展

    我们开发程序时避免不了要有日志系统,我们希望有一个通用的.不夹杂任何方言的调用方式,简单地说就是保留微软日志框架的注入方式和使用方式. 比如我们希望这样调用: 我们不希望有个 IAbcLogger, ...