POJ 1474 Video Surveillance

来源:互联网 发布:酷我营销软件 编辑:程序博客网 时间:2024/05/21 14:40

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 doubleint 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() {                                  // Initwhile(!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 kindans.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_JUDGEfreopen("input.txt","r",stdin);#endifwhile(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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 蜜蜡带久了不亮怎么办 钛钢首饰不亮了怎么办 潘多拉玫瑰金戒指褪色了怎么办 金色手表漆掉了怎么办 玫瑰金表带褪色后怎么办 K金褪色或泛黄怎么办 钛钢玫瑰金变黑怎么办 玫瑰金手镯掉色了怎么办 彩金颜色不亮了怎么办 玫瑰金链子黑了怎么办 18k玫瑰金变黑了怎么办 玫瑰金戒指遇到火变黑怎么办 18k白金发黄了怎么办 18k金掉色后怎么办吗 dw手表金色掉漆怎么办 dw玫瑰金手表褪色怎么办 dw金色表带黑了怎么办 机械表机芯坏了怎么办 银镀玫瑰金褪色怎么办 苹果七p玫瑰金掉漆怎么办 美度镀金表掉色怎么办 吃了发黑的香菇怎么办 脸上的皮肤暗黄怎么办 吃了变黑的香菇怎么办 怀孕喝了玫瑰茶怎么办 孕妇爱喝茉莉茶怎么办 干菊花生虫了该怎么办 黑枸杞放了两年怎么办 来大姨妈喝茶了怎么办 干柠檬片过期了怎么办 山地玫瑰根黑了怎么办 带18k的金过敏怎么办 18k钻戒断了怎么办 18k钻戒戒托变色怎么办 苹果七中间按键脱漆怎么办 苹果手机屏幕边缘掉漆了怎么办 十八k白金变色了怎么办 手机后面掉漆了怎么办 玫瑰金戒指刮花了怎么办 玫瑰金手镯刮花了怎么办 玫瑰金链子断了怎么办