zoukankan      html  css  js  c++  java
  • ●poj 1474 Video Surveillance

    题链:

    http://poj.org/problem?id=1474

    题解:

    计算几何,半平面交

    半平面交裸题,快要恶心死我啦。。。

    (了无数次之后,一怒之下把onleft改为onright,然后还加了一个去重,总算是过了。。。)

    代码:

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 1550
    using namespace std;
    const double eps=1e-8;
    int sign(double x){
    	if(fabs(x)<=eps) return 0;
    	return x<0?-1:1;
    }
    struct Point{
    	double x,y;
    	Point(double _x=0,double _y=0):x(_x),y(_y){}
    	void Read(){scanf("%lf%lf",&x,&y);}
    }D[MAXN];
    typedef Point Vector;
    struct Line{
    	Point s; Vector v; double ang;
    	Line(){}
    	Line(Point _s,Vector _v):s(_s),v(_v){ang=atan2(v.y,v.x);}
    	friend bool operator < (Line A,Line B){return sign(A.ang-B.ang)<0;}
    }L[MAXN];
    bool operator == (Point A,Point B){return sign(A.x-B.x)==0&&sign(A.y-B.y)==0;}
    Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
    Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
    Vector operator * (Vector A,double k){return Vector(A.x*k,A.y*k);}
    double operator ^ (Vector A,Vector B){return A.x*B.y-A.y*B.x;}
    double operator * (Vector A,Vector B){return A.x*B.x+A.y*B.y;}
    bool OnRight(Point P,Line A){return sign(A.v^(P-A.s))<0;}
    Point LLI(Line A,Line B){//Line_Line_Intersection
    	Vector u=B.s-A.s;
    	double t1=(u^B.v)/(A.v^B.v);
    	return A.s+A.v*t1;
    }
    int HPI(int lnt){//Half_Plane_Intersection
    	static Point QP[MAXN]; static Line QL[MAXN];
    	sort(L+1,L+lnt+1);
    	int l=1,r=1,dnt=0; QL[r]=L[1];
    	for(int i=2;i<=lnt;i++){
    		while(l<r&&OnRight(QP[r-1],L[i])) r--;
    		while(l<r&&OnRight(QP[l],L[i])) l++;
    		QL[++r]=L[i];
    		if(sign(QL[r-1].v*QL[r].v)>0&&sign(QL[r-1].v^QL[r].v)==0){
    			r--; if(!OnRight(L[i].s,QL[r])) QL[r]=L[i];
    		}
    		if(l<r) QP[r-1]=LLI(QL[r-1],QL[r]);
    	}
    	while(l<r&&OnRight(QP[r-1],QL[l])) r--;
    	if(r-l<=1) return 0;
    	QP[r]=LLI(QL[r],QL[l]);
    	for(int i=l;i<=r;i++) D[++dnt]=QP[i];
    	dnt=unique(D+1,D+dnt+1)-D-1;
    	return dnt-(dnt>1&&D[dnt]==D[1]);
    }
    int main(){
    	int n,Case=0; 
    	while(~scanf("%d",&n)&&n){
    		for(int i=1;i<=n;i++)
    			D[i].Read(),L[i]=Line(D[i],D[i-1]-D[i]);
    		L[1]=Line(D[1],D[n]-D[1]);
    		n=HPI(n);
    		printf("Floor #%d
    ",++Case);
    		//printf("%d
    ",n);
    		if(n>0) printf("Surveillance is possible.
    ");
    		else printf("Surveillance is impossible.
    ");
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    GreenPlum failover,primary和mirror切换实验 -- 重要
    Greenplum 激活standby 和恢复 master 原有角色
    GreenPlum 常用命令
    Greenplum 添加mirror步骤
    PostgreSQL 多版本的实现与Innodb和oracle的差别
    Oracle 与 postgreSQL 事务处理区别(多版本与undo区别)
    服务器使用bbr加速配置
    线表之队列
    线性表之栈
    线性表之单链表
  • 原文地址:https://www.cnblogs.com/zj75211/p/8370601.html
Copyright © 2011-2022 走看看