题目链接: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了一次之后看了看数据,不然不知道要改多久……机智如我

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define inf 1e10
#define maxn 10010
using namespace std;
int n,head,tail,tot,cnt;
double ans;
const double eps=1e-;
struct point{double x,y;}p[maxn];
point operator +(point x,point y){return (point){x.x+y.x,x.y+y.y};}
point operator -(point x,point y){return (point){x.x-y.x,x.y-y.y};}
struct line{double ang,a,b,c;point pt;}li[maxn],que[maxn];
double dot(point a,point b){return a.x*b.x+a.y*b.y;}
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);}
bool includ(line x,point y){return y.x*x.a+y.y*x.b+x.c<=eps;}
bool comp(line x,line y){
if(x.ang==y.ang)return includ(y,x.pt);
return x.ang<y.ang;
}
point calc(line s1,line s2){
double v1=s1.b*s2.c-s1.c*s2.b,v2=s1.c*s2.a-s1.a*s2.c;
double v0=s1.a*s2.b-s1.b*s2.a;
return (point){v1/v0,v2/v0};
}
bool check(line x,line y,line z){return !includ(z,calc(x,y));}
bool solve(){
head=;tail=;
for(int i=;i<=tot;i++){
if(i>&&fabs(li[i].ang-li[i-].ang)<=eps)continue;
while(head<tail&&check(que[tail-],que[tail],li[i]))tail--;
while(head<tail&&check(que[head],que[head+],li[i]))head++;
que[++tail]=li[i];
}
while(head<tail&&check(que[tail-],que[tail],que[head]))tail--;
while(head<tail&&check(que[head],que[head+],que[tail]))head++;
for(int i=head;i<tail;i++)p[++cnt]=calc(que[i],que[i+]);
p[++cnt]=calc(que[head],que[tail]);
p[cnt+]=p[];
}
void getans(){
ans=;for(int i=;i<=cnt;i++)ans+=cross(p[i],p[i+],(point){,});ans=fabs(ans)/;
}
int main(){
//freopen("polygon.in","r",stdin);
//freopen("polygon.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
double x,y,z;
scanf("%lf%lf%lf",&x,&y,&z);
li[++tot].a=x;li[tot].b=y;li[tot].c=z;
}
++tot,li[tot].a=-,li[tot].b=,li[tot].c=-inf;
++tot,li[tot].a=,li[tot].b=,li[tot].c=-inf;
++tot,li[tot].a=,li[tot].b=-,li[tot].c=-inf;
++tot,li[tot].a=,li[tot].b=,li[tot].c=-inf;
for(int i=;i<=tot;i++){
li[i].ang=atan2(li[i].b,li[i].a);
if(li[i].b) li[i].pt=(point){,-li[i].c/li[i].b};
else li[i].pt=(point){-li[i].c/li[i].a,};
}
sort(li+,li+tot+,comp);
solve();getans();
printf("%.0lf\n",ans);
return ;
}

老oj1965:polygon半平面交的更多相关文章

  1. poj3335 半平面交

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

  2. POJ3525 半平面交

    题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...

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

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

  4. 洛谷 - P2283 - 多边形 - 半平面交

    https://www.luogu.org/problemnew/show/P2283 需要注意max是求解顺序是从右到左,最好保证安全每次都清空就没问题了. #include<bits/std ...

  5. 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交

    4515: [Sdoi2016]游戏 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 129[Submit][Status][ ...

  6. POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交

    题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...

  7. bzoj2618[Cqoi2006]凸多边形 半平面交

    这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...

  8. POJ 3384 Feng Shui 半平面交

    题目大意:一个人很信"Feng Shui",他要在房间里放两个圆形的地毯. 这两个地毯之间可以重叠,可是不能折叠,也不能伸到房间的外面.求这两个地毯可以覆盖的最大范围.并输出这两个 ...

  9. BZOJ2618[Cqoi2006]凸多边形——半平面交

    题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...

随机推荐

  1. [DP之树形DP]

    树形dp出了应该还是比计数dp要简单的 因为很好可以看出来 常用的是一个F记录子树内的 一个G记录子树外的 还有一种就是有环的做过要用状压搞一下 不说这么多直接上例题 [HAOI2015]T1 经典的 ...

  2. ubuntu16.04 samba 配置

    samba是一个很有用的在Linux和Windows之间共享文件的服务器程序,在工作的时候一直在使用,不过都是别人配置好的环境,自已一直没有配置过Samba服务器,今天尝试着自己配置的一次遇到了很多的 ...

  3. C# typeof() 和 GetType()区别

    1.typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称. 2.GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof() ...

  4. ThreadPool

    private void button6_Click(object sender, EventArgs e) { ThreadPool.SetMinThreads(, ); ThreadPool.Se ...

  5. 面向对象---final关键字

    final 在java中表示的意思是最终,也称为完结器,可以用final关键字声明类.属性.方法,在声明时需要注意以下几点: 1.使用final声明的类不能有子类. 2.使用final声明的方法不能被 ...

  6. Unity启动事件-监听:InitializeOnLoad

    [InitializeOnLoad] :在启动Unity的时候运行编辑器脚本  官方案例: using UnityEngine; using UnityEditor; [InitializeOnLoa ...

  7. 接口测试:如何定位BUG的产生原因

    转自公众号<QA之道> 我们从在日常功能测试过程中对UI的每一次操作说白了就是对一个或者多个接口的一次调用,接口的返回的内容(移动端一般为json)经过前端代码的处理最终展示在页面上.ht ...

  8. Chapter 2 Open Book——37

    I couldn't concentrate on Mike's chatter as we walked to Gym, and RE. didn't do much to hold my atte ...

  9. 2016 ACM/ICPC Asia Regional Qingdao Online 1005 Balanced Game

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  10. vue跨组件通信的几种方法

    http://www.tuicool.com/articles/jyM32mA 在开发组件的时候,一定会遇到组件的通信,比如点击一个图标出现弹窗和蒙层,这三个分别是不同的组件.管理他们之间的状态就成了 ...