题目大意:有一个N边形展馆,问展馆内有多少地方可以看到所有墙壁。(N<=1500)

思路:模板题,半平面交求出多边形的核后计算核的面积。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read()
{
int x,f=;char c;
while((c=getchar())<''||c>'')if(c=='-')f=;
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return f?x:-x;
}
#define MN 1500
#define eps 1e-7
struct P{double x,y;}p[MN+];
P operator+(P a,P b){return (P){a.x+b.x,a.y+b.y};}
P operator-(P a,P b){return (P){a.x-b.x,a.y-b.y};}
P operator*(P a,double x){return (P){a.x*x,a.y*x};}
double operator*(P a,P b){return a.x*b.y-a.y*b.x;}
struct line{P p,v;}l[MN+];
bool cmp(line a,line b){return atan2(a.v.y,a.v.x)<atan2(b.v.y,b.v.x);}
int q[MN+],ql,qr;
bool left(line l,P p){return l.v*(p-l.p)>;}
P xp(line a,line b){return a.p+a.v*(b.v*(a.p-b.p)/(a.v*b.v));}
int main()
{
int T=read(),n,i;double ans;
while(T--)
{
n=read();
for(i=;i<n;++i)p[i].x=read(),p[i].y=read();
for(p[n]=p[i=];i<n;++i)l[i].p=p[i+],l[i].v=p[i]-p[i+];
sort(l,l+n,cmp);
for(q[ql=qr=]=,i=;i<n;++i)
{
while(ql<qr&&!left(l[i],p[qr-]))--qr;
while(ql<qr&&!left(l[i],p[ql]))++ql;
if(q[++qr]=i,fabs(l[q[qr]].v*l[q[qr-]].v)<eps)
if(left(l[q[--qr]],l[i].p))q[qr]=i;
if(ql<qr)p[qr-]=xp(l[q[qr-]],l[q[qr]]);
}
while(ql<qr&&!left(l[q[ql]],p[qr-]))--qr;
p[qr]=xp(l[q[qr]],l[q[ql]]);
for(ans=,i=ql;++i<qr;)ans+=(p[i]-p[ql])*(p[i+]-p[ql]);
printf("%.2f\n",fabs(ans)/);
}
}

[POJ]1279: Art Gallery的更多相关文章

  1. poj 1279 Art Gallery - 求多边形核的面积

    /* poj 1279 Art Gallery - 求多边形核的面积 */ #include<stdio.h> #include<math.h> #include <al ...

  2. poj 1279 -- Art Gallery (半平面交)

    鏈接:http://poj.org/problem?id=1279 Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  3. poj 1279 Art Gallery (Half Plane Intersection)

    1279 -- Art Gallery 还是半平面交的问题,要求求出多边形中可以观察到多边形所有边的位置区域的面积.其实就是把每一条边看作有向直线然后套用半平面交.这题在输入的时候应该用多边形的有向面 ...

  4. POJ 1279 Art Gallery 半平面交/多边形求核

    http://poj.org/problem?id=1279 顺时针给你一个多边形...求能看到所有点的面积...用半平面对所有边取交即可,模版题 这里的半平面交是O(n^2)的算法...比较逗比.. ...

  5. POJ 1279 Art Gallery(半平面交)

    题目链接 回忆了一下,半平面交,整理了一下模版. #include <cstdio> #include <cstring> #include <string> #i ...

  6. POJ 1279 Art Gallery(半平面交求多边形核的面积)

    题目链接 题意 : 求一个多边形的核的面积. 思路 : 半平面交求多边形的核,然后在求面积即可. #include <stdio.h> #include <string.h> ...

  7. POJ 1279 Art Gallery 半平面交求多边形核

    第一道半平面交,只会写N^2. 将每条边化作一个不等式,ax+by+c>0,所以要固定顺序,方便求解. 半平面交其实就是对一系列的不等式组进行求解可行解. 如果某点在直线右侧,说明那个点在区域内 ...

  8. POJ 1279 Art Gallery【半平面交】(求多边形的核)(模板题)

    <题目链接> 题目大意: 按顺时针顺序给出一个N边形,求N边形的核的面积. (多边形的核:它是平面简单多边形的核是该多边形内部的一个点集该点集中任意一点与多边形边界上一点的连线都处于这个多 ...

  9. POJ 1279 Art Gallery 半平面交 多边形的核

    题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...

随机推荐

  1. 从PRISM开始学WPF(六)MVVM(三)事件聚合器EventAggregator?

    从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...

  2. mongodb监控工具mongostat

    mongostat的使用及命令详解 mongostat是mongodb自带的状态检测工具,在命令行下使用,会间隔固定时间获取mongodb的当前运行状态,并输出. 1.常用命令格式: mongosta ...

  3. Service Worker和HTTP缓存

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

  4. Sudoku 第一步

    看到这个问题的思路是先解决生成数独生成器的编写,然后再解决数独求解的问题.最开始第一想法就是暴力求解,仔细算一下复杂度,发现这肯定耗时很久,于是看了很多博客(见转载).我们用回溯搜出来正解.

  5. ORA-12514:TNS:lisntener does not currently know of service requested in connect descriptor

    在使用工具连接oracle库的时候出现了异常 根据理解初步估计是服务或者监听器没有启动 于是链接到数据库服务器进行查看  服务都已经开启,重启后链接依旧出现上述问题 使用lsnrctl status  ...

  6. Linux入门:增加用户,并赋予权限

    一.增加用户 1.增加用户,并指定主目录 # useradd –d /usr/sam -m sam此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/us ...

  7. C#微信公众号开发——access_token的获取

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_toke ...

  8. 十个你需要在 PHP 7 中避免的坑

    1. 不要使用 mysql_ 类函数 终于,你不用再看到建议不要使用 mysql_ 函数的提示了.因为 PHP 7 从核心上完全移除了它们,这意味着请你移步至更好的 mysqli_ 类函数,或者更灵活 ...

  9. nexus私服服务器意外关机后,本地不能下载jar包

    主要记录一个小问题. 今天要做个需求,需要读取word文档中的表格来在生成数据库建表语句. 读取word文档,要添加maven依赖 <dependency> <groupId> ...

  10. Oracle12c:支持通过创建identity columen来实现创建自增列

    oracle12c之前如果需要创建自增列必须要通过sequence+trigger来实现.但是oracle12c已经可以像mysql,sqlserver一样通过identity column来设置自增 ...