poj1474 Video Surveillance【半平面交】
2018-01-13 18:02
330 查看
解题思路:
求多边形的内核,半平面交模板。维护时不仅要看队尾直线是否合法,还要看队首的直线是否合法。
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; int getint() { int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f; } const int N=105; struct point { double x,y; point(){} point(double _x,double _y):x(_x),y(_y){} inline friend point operator + (const point &a,const point &b) {return point(a.x+b.x,a.y+b.y);} inline friend point operator - (const point &a,const point &b) {return point(a.x-b.x,a.y-b.y);} inline friend point operator * (const point &a,const double &b) {return point(a.x*b,a.y*b);} inline friend double operator * (const point &a,const point &b) {return a.x*b.y-a.y*b.x;} }p ; struct line { point p,v; double ang; line(){} line(point _p,point _v):p(_p),v(_v) {ang=atan2(v.y,v.x);} inline friend bool operator < (const line &a,const line &b) {return a.ang<b.ang;} }l ,q ; int T,n; bool onleft(point a,line b) { return b.v*(a-b.p)>=0; } point getinter(line a,line b) { double s1=b.v*(a.p-b.p); double s2=((a.p+a.v-b.p)*b.v)+s1; return a.p+a.v*(s1/s2); } int HPI() { sort(l+1,l+n+1); int tmp=1; for(int i=2;i<=n;i++) { if(l[i].ang!=l[i-1].ang)l[++tmp]=l[i]; else if(onleft(l[i].p,l[tmp]))l[tmp]=l[i]; } n=tmp; int head=1,tail=0; for(int i=1;i<=n;i++) { while(head<tail&&!onleft(p[tail],l[i]))tail--; while(head<tail&&!onleft(p[head+1],l[i]))head++; q[++tail]=l[i]; if(head<tail)p[tail]=getinter(q[tail],q[tail-1]); } while(head<tail&&!onleft(p[tail],q[head]))tail--; if(tail-head<=1)return 0; p[1]=getinter(q[tail],q[head]); return 1; } int main() { //freopen("lx.in","r",stdin); while(n=getint()) { if(!n)break; for(int i=1;i<=n;i++)p[i].x=getint(),p[i].y=getint(); p[n+1]=p[1]; for(int i=1;i<=n;i++)l[i]=line(p[i+1],p[i]-p[i+1]); printf("Floor #%d\n",++T); HPI()?puts("Surveillance is possible."):puts("Surveillance is impossible."); putchar('\n'); } return 0; }
相关文章推荐
- BSOJ1850:POJ1474摄像头 计算几何 半平面交
- poj 3335 && poj 3130 && poj 2451 && poj 1474(n(logn)求解半平面交)
- POJ 1474 Video Surveillance 半平面交求多边形是否有核
- 【POJ1474】监控摄像头 半平面交
- [POJ1474]Video Surveillance(半平面交)
- POJ 1474 Video Surveillance 半平面交
- POJ 1474 半平面交
- POJ 1474 ZOJ 1248 HDU 1469 Video Surveillance 半平面交
- poj1474(半平面交)
- poj 1474 Video Surveillance 【半平面交】
- POJ 1474 Video Surveillance(半平面交)
- poj 1474 Video Surveillance (半平面交)
- poj 1474 半平面交求多边形的核
- POJ 1474 Video Surveillance 半平面交求多边形内核存在性
- poj 1474 Video Surveillance 半平面交
- 半平面交入门 poj 3335 poj 1474 poj 1279 半平面交模板
- POJ3335 POJ3130 POJ1474 [半平面交]
- poj 1474 Video Surveillance 半平面交
- POJ 1474 半平面交
- POJ 1474 Video Surveillance(半平面交)