POJ 1474 Video Surveillance
2013-08-22 11:30
148 查看
POJ 1474 Video Surveillance
半平面交模板。。。
就是拿来测试的。。。。
半平面交模板。。。
就是拿来测试的。。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<deque> #include<queue> using namespace std; #define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--) #define oo 1e6 #define eps 1e-6 #define nMax 100000 #define pb push_back #define pf push_front #define F first #define S second #define bug puts("OOOOh....."); #define zero(x) (((x)>0?(x):-(x))<eps) #define LL long long #define DB double int dcmp(double x){ if(fabs(x)<eps) return 0; return x>0?1:-1; } class point { public: double x,y; point (double x=0,double y=0):x(x),y(y) {} void make(double _x,double _y) {x=_x;y=_y;} void read() { scanf("%lf%lf",&x,&y); } void out() { printf("%.2lf %.2lf\n",x,y);} double len() { return sqrt(x*x+y*y); } point friend operator - (point const& u,point const& v) { return point(u.x-v.x,u.y-v.y); } point friend operator + (point const& u,point const& v) { return point(u.x+v.x,u.y+v.y); } double friend operator * (point const& u,point const& v) { return u.x*v.y-u.y*v.x; } double friend operator ^ (point const& u,point const& v) { return u.x*v.x+u.y*v.y; } point friend operator * (point const& u,double const& k) { return point(u.x*k,u.y*k); } friend bool operator < (point const& u,point const& v){ if(dcmp(v.x-u.x)==0) return dcmp(u.y-v.y)<0; return dcmp(u.x-v.x)<0; } friend bool operator != (point const& u,point const& v){ return dcmp(u.x-v.x) || dcmp(u.y-v.y); } }; double const pi = acos(-1.0); typedef point vec; typedef class HalfPlane{ public: point P; vec V; double arg; HalfPlane(){}; HalfPlane(point a,point b):P(a){ V = b-a; arg = atan2(V.y,V.x); } } HP; double const inf = 1e6; deque<HP> que; deque<point> ans; vector<HP> init() { // Init while(!que.empty()) que.pop_back(); while(!ans.empty()) ans.pop_back(); vector<HP> ret;ret.clear(); ret.pb(HP(point(-inf,-inf),point(inf,-inf))); ret.pb(HP(point(inf,-inf),point(inf,inf))); ret.pb(HP(point(inf,inf),point(-inf,inf))); ret.pb(HP(point(-inf,inf),point(-inf,-inf))); return ret; } int satisfy(HP u, point a){ return dcmp(u.V*(a-u.P)) >= 0; } int cmp(HP a,HP b){ int ret = dcmp(a.arg-b.arg); if(ret == 0) return satisfy(b,a.P); return ret < 0; } int parrell(HP a,HP b){ return dcmp(a.V*b.V) == 0; } int same_dir(HP a,HP b){ return dcmp(a.V ^ b.V) >= 0; } int Same(HP a,HP b){ return (dcmp((a.P-b.P)*a.V)==0); } point Intersection(HP a,HP b){ point u = a.P-b.P; double t = (b.V*u)/(a.V*b.V); return a.P + a.V*t; } int erase_back(HP v){ while(ans.size() && !satisfy(v,ans.back())) { if(parrell(v,que.back())) return 0; ans.pop_back(); que.pop_back(); } return 1; } int erase_front(HP v){ while(ans.size() && !satisfy(v,ans.front())) { if(parrell(v,que.front())) return 0; ans.pop_front(); que.pop_front(); } return 1; } int add(HP v){ if(parrell(v,que.back())) return 0; // Can't Be such kind ans.push_back(Intersection(v,que.back())); que.pb(v); return 1; } int HP_insection(vector<HP> hp){ vector<HP> Add =init(); for(int i=0;i<4;i++) hp.pb(Add[i]); sort(hp.begin(),hp.end(),cmp); que.pb(hp[0]); for(int i=1;i<hp.size();i++) { if(dcmp(hp[i].arg - hp[i-1].arg)==0) continue; if(!erase_back(hp[i])) return 0; if(!erase_front(hp[i])) return 0;; if(!add(hp[i])) return 0; } while(ans.size() && !satisfy(que.front(),ans.back())){ ans.pop_back(); que.pop_back(); } while(ans.size() && !satisfy(que.back(),ans.front())) { ans.pop_front(); que.pop_front(); } if(!add(que.front())) return 0; return (int) ans.size(); // return vector<point> (ans.begin(),ans.end()); // if you need; you would better use unique } vector<HalfPlane> v; point p[nMax]; int n; int cas=1; int main(){ #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); #endif while(scanf("%d",&n),n){ for(int i=0;i<n;i++) p[i].read(); v.clear(); for(int i=n-1;i>0;i--) v.pb(HalfPlane(p[i],p[i-1])); v.pb(HalfPlane(p[0],p[n-1])); int ret = HP_insection(v); v.clear(); for(int i=1;i<n;i++) v.pb(HalfPlane(p[i-1],p[i])); v.pb(HalfPlane(p[n-1],p[0])); ret += HP_insection(v); if(ret) printf("Floor #%d\nSurveillance is possible.\n\n",cas); else printf("Floor #%d\nSurveillance is impossible.\n\n",cas); cas++; } return 0; }
相关文章推荐
- POJ 1474 Video Surveillance (多边形内核判断)
- 【POJ1474】监控摄像头 半平面交
- Video Surveillance - POJ 1474(判断是否存在内核)
- poj 1474 Video Surveillance (半平面交)
- POJ 1279&1474 (多边形的核)
- poj 1474 Video Surveillance - 求多边形有没有核
- POJ 1474 Video Surveillance(半平面交)
- [POJ1474] 监控摄像头
- poj1474 Video Surveillance【半平面交】
- POJ 1474 多边形的核(半平面交)
- POJ 1474 半平面交
- POJ 1474 Video Surveillance 半平面交求多边形是否有核
- 半平面交入门 poj 3335 poj 1474 poj 1279 半平面交模板
- poj 1474 Video Surveillance 半平面交
- poj1474(半平面交)
- POJ 1474 半平面交
- [POJ1474]Video Surveillance(半平面交)
- POJ 1474
- ●poj 1474 Video Surveillance
- POJ 1474 Video Surveillance