老oj1965:polygon半平面交
题目链接:http://192.168.2.240:8080/JudgeOnline/showproblem?problem_id=1965
|
polygon半平面交 Time Limit:1000MS Memory Limit:165536K Description Input n为半平面个数,以下n行表示若干半平面。形式如ax+by+c<=0 Output 输出半平面交的面积。保留3位小数 Sample Input 4 Sample Output 4.000 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半平面交的更多相关文章
- poj3335 半平面交
题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...
- POJ3525 半平面交
题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...
- 【kuangbin专题】计算几何_半平面交
1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...
- 洛谷 - P2283 - 多边形 - 半平面交
https://www.luogu.org/problemnew/show/P2283 需要注意max是求解顺序是从右到左,最好保证安全每次都清空就没问题了. #include<bits/std ...
- 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 129[Submit][Status][ ...
- POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交
题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...
- bzoj2618[Cqoi2006]凸多边形 半平面交
这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...
- POJ 3384 Feng Shui 半平面交
题目大意:一个人很信"Feng Shui",他要在房间里放两个圆形的地毯. 这两个地毯之间可以重叠,可是不能折叠,也不能伸到房间的外面.求这两个地毯可以覆盖的最大范围.并输出这两个 ...
- BZOJ2618[Cqoi2006]凸多边形——半平面交
题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...
随机推荐
- VFL语言使用
- AngularJSLiveLessons
https://www.youtube.com/watch?v=8P4K6NCFtJ8&feature=youtu.be&list=PLzpMMGE0rxPkenSURlthkctgK ...
- Vultr新加坡机房速度怎么样?值得购买吗?最新评测!
2016年9月,Vultr vps开通了新加坡Singapore机房线路.与知名的竞争对手Digitalocean和Linode一样,新加坡机房对亚洲速度友好,是讨用户欢心的一个进步. 但是,vult ...
- Html5移动端页面自适应布局详解(阿里rem布局)
在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport,通读网上的各种对于viewport的解释之后 大概viewport可以理解为三种 1.layout viewport ...
- KMP算法 学习例题 POJ 3461Oulipo
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37971 Accepted: 15286 Description The ...
- 嵌入式系统基础知识(一): 系统结构和嵌入式Linux
目录 一. 嵌入式体系结构 二. 开发过程中的分工 三. 嵌入式软件体系结构 四. 嵌入式Linux 一. 嵌入式体系结构 <嵌入式系统设计师教程>这本书的前三章脉络很清晰, 按照嵌入式系 ...
- 【2】JavaScript编程全解笔记(二)
你过去的种种经历,就像人生的一颗颗珍珠,在未来的某一天,你找到了那根线,你就会把她们串联起来,变成美丽的项链. 第八章 客户端 JavaScript 与 HTML 1. 浏览器渲染页面的步骤 2. ...
- JDK版本问题 发展史
jdk是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).SE(J2 ...
- 关于Java集合
之前关于java集合认识,虽然理解,但是总是忘记关键点,今明两天写一篇关于集合的随笔
- sql第一天
关系数据库中的关系指的就是表 table 表 Column 列 Field 字段 Row 行 非空约束 not null 主键约束(PK)primary key constraint 唯 ...