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;}
- POJ 1474 Video Surveillance
- POJ 1474 Video Surveillance
- POJ 1474 Video Surveillance
- poj-1474 Video Surveillance
- POJ 1474 Video Surveillance -
- POJ 1474 Video Surveillance
- POJ 1474 Video Surveillance 笔记
- POJ 1474 Video Surveillance(半平面交)
- poj 1474 Video Surveillance
- poj 1474 Video Surveillance
- POJ 1474 || Video Surveillance(半平面交
- poj 1474 Video Surveillance 半平面交
- Video Surveillance POJ
- poj 1474 Video Surveillance - 求多边形有没有核
- POJ 1474 Video Surveillance(判断多边形是否有核)
- [poj 1474]Video Surveillance[半平面交][多边形的核]
- poj 1474 Video Surveillance(半平面交)
- POJ 1474 Video Surveillance (多边形内核判断)
- [经典面试题]如果与同事发生分歧,你应该怎么办?
- 【struts】安装tomcat的文件夹名称中不要有空格号
- StringUtils详细介绍
- 一道面试题:打印出类中的所有方法名
- 关于android.os.NetworkOnMainThreadException
- POJ 1474 Video Surveillance
- 判断一个字符串是否由数字组成
- 业务逻辑这个是什么东东
- java学习之 ssh框架,里面的一些包得意思
- jQuery选择器总结
- Android 学习笔记 Contacts (三)Contacts 查找,增加,更新,删除联系人
- java学习之instaceof的意思
- 为什么要使用英语开发软件
- 将博客搬至CSDN