题目链接: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. javascript实现页面右侧在线客服始终跟随鼠标滚动而上下滚动且始终位于屏幕中间

    效果如图,右侧的联系一栏始终位于页面的中间位置,且随着页面的上下滚动而滚动跟随 css的话没什么好说的,看图 代码 window.onload=window.onresize=window.onscr ...

  2. C#笔记(二)变量

    C#把数据类型分为两种 ● 值类型 ● 引用类型 从概念上看:其区别是值类型直接存储其值,而引用类型存储对值的引用 这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上 如果变 ...

  3. ios开发之滑动长图截全屏应用

    最近做项目遇到要求截取图片长度超出手机屏幕,即可滑动的长图截屏,这里简单说一下解决思路,下面附带Demo下载地址. ,当我们要截全屏时,将滑动视图的frame以及偏移量记录下来,然后将滑动视图偏移量设 ...

  4. C#基础、基础知识点(新人自我总结,开启java学习之路)

    从2016年12月29开班,开课到现在C#基础已经算是简答的学习了一点,一个为期两周的课程,或多或少对现在学的Java有着一定的帮助吧,我们先从软件入门来接触c#这门语言: 一.软件开发中的常用术语: ...

  5. [DP优化方法之虚树]

    首先我们看一篇文章 转自xyz: 给出一棵树. 每次询问选择一些点,求一些东西.这些东西的特点是,许多未选择的点可以通过某种方式剔除而不影响最终结果. 于是就有了建虚树这个技巧..... 我们可以用l ...

  6. mybatis(1)

    一.MyBatis简介 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBatis ...

  7. 3、href和src的区别

    href:将现在的页面连接到新的页面 src:将需要引用的东西添加到现在的页面 <a href="mailto:youremailaddress@host.com">C ...

  8. canvas绘图基础及基于粒子系统的雪花飘落

    canvas是html中的一个元素,可以通过js操控绘图! 可以绘制各种图形,各种填充样式! 绘制时可以进行旋转,缩放,平移,但并不是很灵活! 有一对比较好用的方法是save restore! sav ...

  9. mysql 查询语句

    查询一段时间到另一段时间的数据 $from=$_POST['from']; $to=$_POST['to']; $query_xiangmu ="SELECT * FROM yichang ...

  10. 异步设备IO:OVERLAPPED和IOCompletionPort

    异步设备IO:OVERLAPPED和IOCompletionPort 本文内容为<windows核心编程>第10章内容的总结,仅记录一些本人感兴趣的内容. 1:OVERLAPPED &qu ...