老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,表示凸多边形的个数,以下依次描述各个多边形.第 ...
随机推荐
- Lua 日志
Lua 环境安装 编辑调试Lua脚本
- Linux网络常用头文件说明
sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函 ...
- c# 读取ACCESS 数据库
using System; using System.Collections.Generic; using System.Data.OleDb; using System.IO; using Syst ...
- Openjudge-NOI题库-和为给定数
题目描述 Description 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入输出格式 Input/output 输入格式: 共三行: 第一行是整数n(0 < n <= ...
- HTML5 <canvas> 基础学习
HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. <canvas> 标签只是图形容器,您必须使用脚本来绘制图形 创建一个画布( ...
- size_t
size_t在C语言中就有了.它是一种"整型"类型,里面保存的是一个整数,就像int, long那样.这种整数用来记录一个大小(size).size_t的全称应该是size typ ...
- shell实现四则运算简单方法
在刚刚学习写shell 批处理时候,进行逻辑运算中,少不了需要进行基础的:四则运算,这里说说在linux shell 里面简单的实现方法.1.简单方法$ b=$((5*5+5-3/2)) $ echo ...
- HDU 5890 Eighty seven
预处理,$01$背包,$bitset$优化. 可以预处理出每一种询问的答案,用$01$背包计算答案,$dp[i][j][k]$表示,前$i$个数字中,选择了$j$个,能否凑出$k$这个数字,可以开成$ ...
- RTMP直播应用与延时分析
直播应用中,RTMP和HLS基本上可以覆盖所有客户端观看,HLS主要是延时比较大,RTMP主要优势在于延时低. 一.应用场景 低延时应用场景包括: . 互动式直播:譬如2013年大行其道的美女主播 ...
- Java的URL来下载网页源码
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; impor ...