//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define ll long long
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define eps 1e-11
#define zero(a) fabs(a)<eps
using namespace std; const int INF = 0x3f3f3f3f;
const int N = ; struct Point{
double x,y;
}p[N*];
struct Segment{
Point s,e;
double angle;
void get_angle(){angle=atan2(e.y-s.y,e.x-s.x);}
}seg[N];
int m;
//叉积为正说明,p2在p0-p1的左侧
double xmul(Point p0,Point p1,Point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
Point Get_Intersect(Segment s1,Segment s2){
double u=xmul(s1.s,s1.e,s2.s),v=xmul(s1.e,s1.s,s2.e);
Point t;
t.x=(s2.s.x*v+s2.e.x*u)/(u+v);t.y=(s2.s.y*v+s2.e.y*u)/(u+v);
return t;
}
bool cmp(Segment s1,Segment s2){
//先按极角排序
if(s1.angle>s2.angle) return true;
//极角相等,内侧的在前
else if(zero(s1.angle-s2.angle)&&xmul(s2.s,s2.e,s1.e)>-eps) return true;
return false;
}
void HalfPlaneIntersect(Segment seg[],int n){
sort(seg,seg+n,cmp);
int tmp=;
for(int i=;i<n;i++)
if(!zero(seg[i].angle-seg[tmp-].angle))
seg[tmp++]=seg[i];
n=tmp;
Segment deq[N];
deq[]=seg[];deq[]=seg[];
int head=,tail=;
for(int i=;i<n;i++){
while(head<tail&&xmul(seg[i].s,seg[i].e,Get_Intersect(deq[tail],deq[tail-]))<-eps) tail--;
while(head<tail&&xmul(seg[i].s,seg[i].e,Get_Intersect(deq[head],deq[head+]))<-eps) head++;
deq[++tail]=seg[i];
}
while(head<tail&&xmul(deq[head].s,deq[head].e,Get_Intersect(deq[tail],deq[tail-]))<-eps) tail--;
while(head<tail&&xmul(deq[tail].s,deq[tail].e,Get_Intersect(deq[head],deq[head+]))<-eps) head++;
if(head==tail) return;
m=;
for(int i=head;i<tail;i++)
p[m++]=Get_Intersect(deq[i],deq[i+]);
if(tail>head+)
p[m++]=Get_Intersect(deq[head],deq[tail]);
}
double Get_area(Point p[],int &n){
double area=;
for(int i=;i<n-;i++)
area+=xmul(p[],p[i],p[i+]);
return fabs(area)/2.0;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
seg[].s.x=;seg[].s.y=;seg[].e.x=;seg[].e.y=;seg[].get_angle();
seg[].s.x=;seg[].s.y=;seg[].e.x=;seg[].e.y=;seg[].get_angle();
seg[].s.x=;seg[].s.y=;seg[].e.x=;seg[].e.y=;seg[].get_angle();
seg[].s.x=;seg[].s.y=;seg[].e.x=;seg[].e.y=;seg[].get_angle();
for(int i=;i<n;i++){
scanf("%lf%lf%lf%lf",&seg[i+].s.x,&seg[i+].s.y,&seg[i+].e.x,&seg[i+].e.y);
seg[i+].get_angle();
}
HalfPlaneIntersect(seg,n+);
printf("%.1f\n",Get_area(p,m));
}
return ;
}

POJ 2451 Uyuw's Concert(半平面交nlgn)的更多相关文章

  1. poj 2451 Uyuw's Concert(半平面交)

    Uyuw's Concert Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8580   Accepted: 3227 De ...

  2. poj 2451 Uyuw's Concert (半平面交)

    2451 -- Uyuw's Concert 继续半平面交,这还是简单的半平面交求面积,不过输入用cin超时了一次. 代码如下: #include <cstdio> #include &l ...

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

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

  4. POJ 2451 Uyuw's Concert (半平面交)

    题目链接:POJ 2451 Problem Description Prince Remmarguts solved the CHESS puzzle successfully. As an awar ...

  5. poj 2451 Uyuw's Concert

    [题目描述] Remmarguts公主成功地解决了象棋问题.作为奖励,Uyuw计划举办一场音乐会,地点是以其伟大的设计师Ihsnayish命名的巨大广场. 这个位于自由三角洲联合王国(UDF,Unit ...

  6. POJ 3384 Feng Shui 半平面交

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

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

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

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

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

  9. poj3335 半平面交

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

随机推荐

  1. 闲来无事写写-Huffman树的生成过程

    前言:最近项目上一直没事干,感觉无聊到了极点,给自己找点事做,补一下大学没有完成的事情,写一个huffman算法Java版的,学校里面写过c语言的. 因为很久没搞数据结构和算法这方面了(现在搞Java ...

  2. AES 加密

    package com.sprucetec.tms.utils; import java.security.Key; import javax.crypto.Cipher;import javax.c ...

  3. HDU 3589 Jacobi symbol

    彻底对数学绝望了 #include <cstdio> #include <cmath> int flag[1005],p[500],a; int d[100]; int ini ...

  4. SqlServer2012导入Oracle详细案例

    第一次使用SqlServer2012,界面和VS2012风格一致了,Great! 进入正题,这篇博文主要写一下自己亲测的一个案例,使用SqlServer2012的“导入和导出数据”功能向Oracle1 ...

  5. 用git上传项目到github

    1 git  clone  github仓库地址 2 git add . 3 git  commit -m "changes log" 4 git remote add origi ...

  6. java线程学习——汉堡销售问题

    汉堡店中有一个负责做汉堡的厨师,一个负责销售的营业员,用java线程表示他们的营业过程: 问题原型就是生产者与消费者的问题. 首先定义一个汉堡包箱子类与几个相关的变量类: public class H ...

  7. javascript - C++, Qt, QtWebKit: How to create an html rendering window so that your application would get callbacks from JS calls? - Stack Overflow

    javascript - C++, Qt, QtWebKit: How to create an html rendering window so that your application woul ...

  8. Intersection(poj)

    Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13140   Accepted: 3424 Des ...

  9. 编译和安装shibboleth-sp遇到的问题

    In file included from mod_shib_20.cpp:68: mod_shib.cpp:118: warning: deprecated conversion from stri ...

  10. Python经常使用第三方工具、库、骨架

    Python ImagingLibrary(PIL):它提供强大的图形处理的能力,并提供广泛的图形文件格式支持.该库能进行图形格式的转换.打印和显示.还能进行一些图形效果的处理,如图形的放大.缩小和旋 ...