题目链接:http://192.168.2.240:8080/JudgeOnline/showproblem?problem_id=1965

polygon半平面交

Time Limit:1000MS  Memory Limit:165536K
Total Submit:66 Accepted:25 
Case Time Limit:100MS

Description

Input

n为半平面个数,以下n行表示若干半平面。形式如ax+by+c<=0

Output

输出半平面交的面积。保留3位小数 
保证面积有限。 
有多组数据:

Sample Input

4
1 0 -1
0 1 -1
-1 0 -1
0 -1 -1

Sample Output

4.000
数据保证:N<=10000
半平面交出的多边形的坐标在10^10以内。

Source

计算几何 半平面交

半平面交裸题。

讲道理不是说好保留三位小数吗,TMD数据全是保留到整数……幸好我WA了一次之后看了看数据,不然不知道要改多久……机智如我

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define inf 1e10
 7 #define maxn 10010
 8 using namespace std;
 9 int n,head,tail,tot,cnt;
10 double ans;
11 const double eps=1e-15;
12 struct point{double x,y;}p[maxn];
13 point operator +(point x,point y){return (point){x.x+y.x,x.y+y.y};}
14 point operator -(point x,point y){return (point){x.x-y.x,x.y-y.y};}
15 struct line{double ang,a,b,c;point pt;}li[maxn],que[maxn];
16 double dot(point a,point b){return a.x*b.x+a.y*b.y;}
17 double cross(point x,point y,point z){return (x.x-z.x)*(y.y-z.y)-(x.y-z.y)*(y.x-z.x);}
18 bool includ(line x,point y){return y.x*x.a+y.y*x.b+x.c<=eps;}
19 bool comp(line x,line y){
20     if(x.ang==y.ang)return includ(y,x.pt);
21     return x.ang<y.ang;
22 }
23 point calc(line s1,line s2){
24     double v1=s1.b*s2.c-s1.c*s2.b,v2=s1.c*s2.a-s1.a*s2.c;
25     double v0=s1.a*s2.b-s1.b*s2.a;
26     return (point){v1/v0,v2/v0};
27 }
28 bool check(line x,line y,line z){return !includ(z,calc(x,y));}
29 bool solve(){
30     head=1;tail=0;
31     for(int i=1;i<=tot;i++){
32         if(i>1&&fabs(li[i].ang-li[i-1].ang)<=eps)continue;
33         while(head<tail&&check(que[tail-1],que[tail],li[i]))tail--;
34         while(head<tail&&check(que[head],que[head+1],li[i]))head++;
35         que[++tail]=li[i];
36     }
37     while(head<tail&&check(que[tail-1],que[tail],que[head]))tail--;
38     while(head<tail&&check(que[head],que[head+1],que[tail]))head++;
39     for(int i=head;i<tail;i++)p[++cnt]=calc(que[i],que[i+1]);
40     p[++cnt]=calc(que[head],que[tail]);
41     p[cnt+1]=p[1];
42 }
43 void getans(){
44     ans=0;for(int i=1;i<=cnt;i++)ans+=cross(p[i],p[i+1],(point){0,0});ans=fabs(ans)/2;
45 }
46 int main(){
47     //freopen("polygon.in","r",stdin);
48     //freopen("polygon.out","w",stdout);
49     scanf("%d",&n);
50     for(int i=1;i<=n;i++){
51         double x,y,z;
52         scanf("%lf%lf%lf",&x,&y,&z);
53         li[++tot].a=x;li[tot].b=y;li[tot].c=z;
54     }
55     ++tot,li[tot].a=-1,li[tot].b=0,li[tot].c=-inf;
56     ++tot,li[tot].a=1,li[tot].b=0,li[tot].c=-inf;
57     ++tot,li[tot].a=0,li[tot].b=-1,li[tot].c=-inf;
58     ++tot,li[tot].a=0,li[tot].b=1,li[tot].c=-inf;
59     for(int i=1;i<=tot;i++){
60         li[i].ang=atan2(li[i].b,li[i].a);
61         if(li[i].b) li[i].pt=(point){0,-li[i].c/li[i].b};
62         else li[i].pt=(point){-li[i].c/li[i].a,0};
63     }
64     sort(li+1,li+tot+1,comp);
65     solve();getans();
66     printf("%.0lf\n",ans);
67     return 0;
68 }

View Code

转载于:https://www.cnblogs.com/longshengblog/p/5741592.html

老oj1965:polygon半平面交相关推荐

  1. 【kuangbin专题】计算几何_半平面交

    1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...

  2. poj3335 半平面交

    题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...

  3. bzoj 3190 赛车 半平面交

    直接写的裸的半平面交,已经有点背不过模板了... 这题卡精度,要用long double ,esp设1e-20... #include<iostream> #include<cstd ...

  4. BZOJ 1038: [ZJOI2008]瞭望塔 半平面交

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1 ...

  5. 计算几何学习之半平面交

    首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面. 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax ...

  6. [BZOJ2033][清橙A1215][2009国家集训队]大灾变-半平面交

    大灾变 Description 艾泽拉斯世界经历一场亘古未有的地震过后,大地和海洋被完全撕裂,旧大陆残缺不全.联盟和部落各种族的居民们被迫离开了世代居住的家园,来寻找新的生存空间.原本平坦的陆地上现在 ...

  7. 【POJ1474】监控摄像头 半平面交

    题目描述 一个著名的仓库管理公司SERKOI 请你为其安装一套闭路监视系统,由于SERKOI 财力有限,每个房间只能安装一台摄像机,不过其镜头可以向任何方向转换. 请你写一个程序,对于给定的房间示意图 ...

  8. [BZOJ1038]ZJOI2008瞭望塔|半平面交

    考虑某个村庄可以被看见的区域,发现一条线段的上方就是可以看见端点的区域,那就把所有线段扔进去做半平面交,不要忘记了要加上两条左右边界..求出来之后发现答案要么是某个村庄往上到半平面交的一段距离,要么是 ...

  9. BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交

    发现最终的结果只和$s1$,$s2$,$s3$之间的比例有关. 所以直接令$s3=1$ 然后就变成了两个变量,然后求一次半平面交. 对于每一个询问所属的直线,看看半平面在它的那一侧,或者相交就可以判断 ...

最新文章

  1. 内存泄漏检测工具VLD在VS2010中的使用举例
  2. 动软发布微信营销服务系统,微信商城系统!
  3. Redis-11使用 watch 命令监控事务
  4. 2018.8.14-C++复习笔记总
  5. 尼日利亚学生开发者,用阿里云PAI打造了卡通头像神器
  6. C语言学习之输入任意年份,判断是否为闰年
  7. 学习笔记6-小项目-走迷宫、推箱子
  8. java调用一个方法后怎么继续执行不等待该方法的返回_Java面试题大全2020版(二)...
  9. Android性能优化(31)---虚拟机调优
  10. 黄刘生--数据结构--答案 2
  11. BOOST升压电路--34063升压升不上去
  12. 1 常见的HTTP股票数据接口整理 腾讯 新浪 网易 2019-08-02
  13. cactiez mysql_CactiEz 无法登陆 、重启不画图处理
  14. 两级运放积分器的带宽分析
  15. 汉语转拼音(带音调和多音字识别)
  16. SVD——奇异值分解概述
  17. P1125 [NOIP2008 提高组] 笨小猴 java
  18. ofbiz——工作流学习笔记一(xpdl)
  19. google身份验证器
  20. 【MySQL】JDBC编程

热门文章

  1. 附加数据时出错,有关详细信息,请单击消息。
  2. 干 MySQL 两千万数据的大表优化解决过程,三种厉害的解决方案
  3. 为什么大部分人做不了架构师?这2点是关键
  4. 深入理解 SpringBoot 启动机制(starter 机制)
  5. CPU 到底是怎么认识代码的?涨姿势了!
  6. HashMap?面试?我是谁?我在哪
  7. 天天用Synchronized,底层原理是个啥?
  8. Spring@Cacheable注解在类内部调用失效的问题
  9. 面试字节跳动,我被怼了……
  10. volatile关键字解析~高级java必问