【题目描述】

Remmarguts公主成功地解决了象棋问题。作为奖励,Uyuw计划举办一场音乐会,地点是以其伟大的设计师Ihsnayish命名的巨大广场。

这个位于自由三角洲联合王国(UDF,United Delta of Freedom)最繁华地带的广场是一个坐标范围[0,10000]*[0,10000]的正方形。有一些长椅已经固定在广场上许多年了,但是杂乱无章。见下图:

我们有三张长椅,并且观众面对的方向已经用箭头画出。这些椅子年代久远,并且沉重得无法移动。Remmarguts公主让广场现在的主人UW先生在广场上修建一个大的舞台。这个舞台应当尽可能大,但必须确保在任意长椅上任意位置的观众不必转身就能看到舞台(也就是说舞台必须在长椅所在直线的观众朝向那一侧)。

为了简化问题,舞台的高度可以任意高来确保只要你面向舞台所在的那一侧,你就能看到舞台上的歌唱家/画家——Uyuw,即使你的面前有数千张长椅。

作为一名脑残粉,你能告诉他们舞台的最大面积吗?

【输入格式】

输入包含不超过10组数据。

每组数据格式如下:

第一行有一个整数N(N<=20000),代表长椅的数量。

接下来有N行,每行有4个整数x1,y1,x2,y2,代表一张长椅。这张长椅是以(x1,y1)和(x2,y2)为端点的线段,并且面向其左侧。一个点(x,y)在线段左侧是指(x-x1)*(y-y2)-(x-x2)*(y-y1)>=0.

【输出格式】

对每组数据输出一个一个实数,即舞台的最大面积。精确到1位小数。你的答案被认为是正确的当且仅当它与标准答案之差小于0.2。

【样例输入】

3

10000 10000 0 5000

10000 5000 5000 10000

0 5000 5000 0

【样例输出】

54166666.7

【提示】

样例如下:

建议你采用Pascal中的Extended类型或者C/C++中的long double类型来避免精度误差。不过标程仅仅用了double。

半平面交模板(太坑了)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef double ld;
struct point
{
ld x,y;
point(){}
point(ld _x,ld _y) {x=_x,y=_y;}
}p[];
struct Line
{
point a,b;
ld angle;
Line(){}
Line(point _a,point _b) {a=_a,b=_b;}
}line[],sta[];
ld eps=1e-,ans;
int n,cnt;
point operator -(point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
int dcmp(ld x)
{
if (x>eps) return ;
if (x<-eps) return -;
return ;
}
ld cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
ld getangle(Line l)
{
return atan2(l.b.y-l.a.y,l.b.x-l.a.x);
}
point inter(Line u,Line v)
{
double k1=(cross((u.b-v.a),(v.b-v.a)));
double k2=(cross((v.b-v.a),(u.a-v.a)));
double t=k1/(k1+k2);
return point(u.b.x+(u.a.x-u.b.x)*t,u.b.y+(u.a.y-u.b.y)*t);
}
bool cmp(Line u,Line v)
{
int t=dcmp(u.angle-v.angle);
if (t) return t<;
return dcmp(cross(u.a-v.b,v.a-v.b))>;
}
bool judge(Line a,Line b,Line c)
{
point p=inter(b,c);
return dcmp(cross(a.a-p,a.b-p))<;
}
void HPT()
{int i,head,tail;
sort(line+,line+n+,cmp);
int tmp=;
for (i=;i<=n;i++)
if (dcmp(line[i].angle-line[i-].angle)!=)
line[++tmp]=line[i];
n=tmp;
head=,tail=;
sta[]=line[];sta[]=line[];
for (i=;i<=n;i++)
{
while (tail->=head&&judge(line[i],sta[tail],sta[tail-])) tail--;
while (head+<=tail&&judge(line[i],sta[head+],sta[head])) head++;
tail++;
sta[tail]=line[i];
}
while (tail->=head&&judge(sta[head],sta[tail],sta[tail-])) tail--;
while (head+<=tail&&judge(sta[tail],sta[head+],sta[head])) head++;
cnt=;
if (tail-head<=) return;
for (i=head;i<tail;i++)
{
p[++cnt]=inter(sta[i],sta[i+]);
}
if (tail>head+)
p[++cnt]=inter(sta[head],sta[tail]);
}
int main()
{
int i;
while (cin>>n)
{
n+=;
line[]=Line(point(,),point(,));
line[]=Line(point(,),point(,));
line[]=Line(point(,),point(,));
line[]=Line(point(,),point(,));
line[].angle=getangle(line[]);
line[].angle=getangle(line[]);
line[].angle=getangle(line[]);
line[].angle=getangle(line[]);
for (i=;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&line[i].a.x,&line[i].a.y,&line[i].b.x,&line[i].b.y);
line[i].angle=getangle(line[i]);
}
HPT();
ans=;
for (i=;i<cnt;i++)
{
ans+=cross(p[i]-p[],p[i+]-p[])/2.0;
}
ans=fabs(ans);
printf("%.1lf\n",ans);
}
return ;
}

poj 2451 Uyuw's Concert的更多相关文章

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

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

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

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

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

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

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

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> # ...

  5. bzoj 2451 Uyuw's Concert

    裸的半平面交.感觉这些东西,纯属在考代码能力啊.. #include<cstdio> #include<algorithm> #include<cmath> #de ...

  6. 计算几何模板 (bzoj 1336,poj 2451 ,poj3968)

    poj 3968 (bzoj 2642) 二分+半平面交,每次不用排序,这是几个算几版综合. #include<iostream> #include<cstdio> #incl ...

  7. POJ2451 Uyuw's Concert(半平面交)

    题意就是给你很多个半平面,求半平面交出来的凸包的面积. 半平面交有O(n^2)的算法,就是每次用一个新的半平面去切已有的凸包,更新,这个写起来感觉也不是特别好写. 另外一个O(nlogn)的算法是将半 ...

  8. Uyuw's Concert POJ2451

    裸半平面交,以前没写过,先写一遍再说 我越来越不注意细节了,最后才发现空间稍微开小了(没有开那个零头,他又要多4条边,就WA了) const maxn=; eps=1e-7; type point=r ...

  9. [poj2451]Uyuw's Concert

    半平面交滴裸题,但是要求nlogn,练练手 #include<iostream> #include<cstdio> #include<cmath> #include ...

随机推荐

  1. 【django之权限组件】

    一.需求分析 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,一个角色拥有若干权限.这样,就构造成& ...

  2. C语言第三次作业总结

    本次作业的亮点 总体情况 大部分同学基本掌握了单层循环结构的写法,懂得了代码调试的过程 PTA通过率及作业质量都不错,希望再接再厉 推荐博客 黄毓颖 推荐理由:代码思路清晰,格式良好:调试过程相当形象 ...

  3. android 框架LoonAndroid,码农偷懒专用

    介绍 http://www.eoeandroid.com/thread-324764-1-1.html 架构培训视频: http://pan.baidu.com/s/1mgv8HTm 简介:下载 ht ...

  4. Three.js three.js Uncaught TypeError: Cannot read property 'getExtension' of null

    在调试Three.js执行加载幕布的时候,突然爆出这个错误three.js Uncaught TypeError: Cannot read property 'getExtension' of nul ...

  5. python之路--day15---软件开发目录规范

    软件开发目录规范 bin--启动文件 conf--配置文件 core--核心代码 db--数据文件 lib--常用功能代码 log--日志文件 readme--软件介绍

  6. JAVA_SE基础——37.main方法的详解

    主函数 大家都会写吧. 大家一直都不知道为何这样设计,这样设计有什么好处呢? 白话解释: main函数的修饰符是public: 公共的 为何不用private 等等的修饰符 而规定只用public呢? ...

  7. Service Worker和HTTP缓存

    很多人,包括我自己,初看Service Worker多一个Cache Storage的时候,就感觉跟HTTP长缓存没什么区别. 例如大家讲的最多的Service Worker能让网页离线使用,但熟悉H ...

  8. 剑指offer-二叉树中和为某一值的路径

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.   解题思路 利用前序遍历的思想,定义FindP ...

  9. PHP模式设计之单例模式、工厂模式、注册树模式、适配器模式、观察者模式

    php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大 ...

  10. iot前台开发环境:前后台访问映射

    一.前端映射- java代码 二.路由设置 -前台代码 三.访问应用