题目描述:

vjudge

POJ

题解:

半平面交判核的存在性。

重点在于一个点的核也算核

这样的话普通的求多边形的版本就要加一个特判。

就是把剩下的一个节点暴力带回所有直线重判,这时判叉积是否$\leq 0$,而不是$<0$。

好人一生平安

代码:

#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
const double eps = 1e-;
int dcmp(double x)
{
if(fabs(x)<=eps)return ;
return x>?:-;
}
struct Point
{
double x,y;
Point(){}
Point(double x,double y):x(x),y(y){}
Point operator + (const Point&a)const{return Point(x+a.x,y+a.y);}
Point operator - (const Point&a)const{return Point(x-a.x,y-a.y);}
Point operator * (const double&a)const{return Point(x*a,y*a);}
double operator ^ (const Point&a)const{return x*a.y-y*a.x;}
};
typedef Point Vector;
typedef vector<Point> Pol;
double ang(const Vector&v){return atan2(v.x,v.y);}
struct Line
{
Point p;
Vector v;
Line(){}
Line(Point p,Vector v):p(p),v(v){}
bool operator < (const Line&a)const
{
return ang(v)<ang(a.v);
}
};
bool Onleft(Line a,Point p)
{
return dcmp((a.v^(p-a.p)))>;
}
bool onleft(Line a,Point p)
{
return dcmp((a.v^(p-a.p)))>=;
}
Point L_L(Line a,Line b)
{
double t = ((b.p-a.p)^b.v)/(a.v^b.v);
return a.p+a.v*t;
}
int T,n;
Point p[N],tp[N];
Line s[N],ts[N];
int bpmj()
{
memset(ts,,sizeof(ts));memset(tp,,sizeof(tp));
sort(s+,s++n);
int hd,tl;
ts[hd=tl=]=s[];
for(int i=;i<=n;i++)
{
while(hd<tl&&!Onleft(s[i],tp[tl-]))tl--;
while(hd<tl&&!Onleft(s[i],tp[hd]))hd++;
ts[++tl] = s[i];
if(!dcmp(ts[tl].v^ts[tl-].v))
{
tl--;
if(Onleft(ts[tl],s[i].p))ts[tl]=s[i];
}
if(hd<tl)tp[tl-] = L_L(ts[tl-],ts[tl]);
}
while(hd<tl&&!Onleft(ts[hd],tp[tl-]))tl--;
if(hd==tl)
{
Point now = tp[hd];
for(int i=;i<=n;i++)
if(!onleft(s[i],now))
return ;
}
return ;
}
void build1()
{
for(int i=;i<n;i++)s[i]=Line(p[i],p[i+]-p[i]);
s[n] = Line(p[n],p[]-p[n]);
}
void build2()
{
for(int i=,j=n;i<j;i++,j--)swap(p[i],p[j]);
for(int i=;i<n;i++)s[i]=Line(p[i],p[i+]-p[i]);
s[n] = Line(p[n],p[]-p[n]);
}
void work()
{
scanf("%d",&n);int ans = ;
for(int i=;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
build1();
ans|=bpmj();
build2();
ans|=bpmj();
if(ans)puts("YES");
else puts("NO");
}
int main()
{
// freopen("tt.in","r",stdin);
scanf("%d",&T);
while(T--)work();
return ;
}

poj3335 Rotating Scoreboard的更多相关文章

  1. 山东省ACM多校联盟省赛个人训练第六场 poj 3335 D Rotating Scoreboard

    山东省ACM多校联盟省赛个人训练第六场 D Rotating Scoreboard https://vjudge.net/problem/POJ-3335 时间限制:C/C++ 1秒,其他语言2秒 空 ...

  2. 【POJ 3335】 Rotating Scoreboard (多边形的核- - 半平面交应用)

    Rotating Scoreboard Description This year, ACM/ICPC World finals will be held in a hall in form of a ...

  3. poj 3335 Rotating Scoreboard - 半平面交

    /* poj 3335 Rotating Scoreboard - 半平面交 点是顺时针给出的 */ #include <stdio.h> #include<math.h> c ...

  4. poj 3335 Rotating Scoreboard(半平面交)

    Rotating Scoreboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6420   Accepted: 25 ...

  5. POJ 3335 Rotating Scoreboard(半平面交 多边形是否有核 模板)

    题目链接:http://poj.org/problem? id=3335 Description This year, ACM/ICPC World finals will be held in a ...

  6. poj 3335 Rotating Scoreboard (Half Plane Intersection)

    3335 -- Rotating Scoreboard 给出一个多边形,要求判断它的内核是否存在. 还是半平面交的题,在这道题中,公告板允许其所在位置与直线共线也算是可见,于是我们就可以将每一条直线微 ...

  7. POJ3335:Rotating Scoreboard——题解

    http://poj.org/problem?id=3335 题目大意:给按照顺时针序的多边形顶点,问其是否有内核. —————————————————————————————— 看了两个小时的资料, ...

  8. POJ 3335 Rotating Scoreboard(多边形的核)

    题目链接 我看的这里:http://www.cnblogs.com/ka200812/archive/2012/01/20/2328316.html 然后整理一下当做模版.0换成eps,会wa,应该要 ...

  9. POJ 3335 Rotating Scoreboard(半平面交求多边形核)

    题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...

随机推荐

  1. Linux命令 查看Linux版本和是否联网

    1.查看Linux内核版本 1.1 $ cat /proc/version [heima01@heima01 ~]$ cat /proc/version Linux version 2.6.32-57 ...

  2. 第一个Three.js程序——加入相机

  3. jquery中的$(this)和this

    在jquery中,存在$(this)和this. 其中常见的是出现在事件处理函数中. 首先先来理解jquery对象. jquery对象其实就是DOM对象的集合. 比如:$('a')[0];------ ...

  4. Leetcode:单调数列

    题目 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j,A[i]> ...

  5. [Android基础]Android四大组件之Activity总结

    1.Activity简介 Activity是Android一个非常重要的用户接口(四大组件之一),是可见的,主要是用户和应用程序之间进行交互的接口.在每个Activity中都可以放很多控件,所以也可以 ...

  6. Hypertext Application Language(HAL)

    Hypertext Application Language(HAL) HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式, ...

  7. CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)

    旅程4:扩展和增强订单和注册限界上下文 进一步探索订单和注册的有界上下文. "我明白,如果一个人想看些新鲜的东西,旅行并不是没有意义的."儒勒·凡尔纳,环游世界80天 对限界上下文 ...

  8. 获取jqGrid中选择的行的数据

    下面可以获取选择一行的id,如果你选择多行,那下面的id是最后选择的行的id: var id=$(‘#gridTable’).jqGrid(‘getGridParam’,'selrow’); 如果想要 ...

  9. nodejs 实践:express 最佳实践 (一) 项目结构

    express 最佳实践 (一) 第二篇: express 最佳实践(二):中间件 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色 ...

  10. 写TXT文件

    #region 写日志 private static void writelog(string strwrite) { string strPath = "d:/log.txt"; ...