POJ 1755 Triathlon 半平面交
另一种模板
View Code
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> #include<math.h> using namespace std; #define eps 1e-8 #define inf 1<<29 struct point { double x, y; bool mark; point(){} point(double xx, double yy) : x(xx), y(yy), mark(1) {} }; vector<point> p; double aa[105], bb[105], cc[105]; int n; point intersect( point p1, point p2, double a, double b, double c) { double u = fabs(a * p1.x + b * p1.y + c); double v = fabs(a * p2.x + b * p2.y + c); point ans; ans.x = (v * p1.x + u * p2.x) / (u + v); ans.y = (v * p1.y + u * p2.y) / (u + v); return ans; } void cut(double a, double b, double c) { int i; point tp; for(i = 0; i < p.size(); i++) if(a * p[i].x + b * p[i].y + c > eps) p[i].mark = 1; else p[i].mark = 0; p.push_back( p[0] ); for(i = 0; i < p.size() - 1; i++) if( p[i].mark^p[i+1].mark == 1) { tp = intersect(p[i], p[i+1], a, b, c); p.insert(p.begin()+i+1, tp); i++; } p.pop_back(); for(i = 0; i < p.size(); i++) if(p[i].mark == 0) p.erase(p.begin()+i),i--; } bool solve( int v) { int i; for(i = 1; i <= n; i++) if(i != v) { cut(1/aa[i]-1/aa[v], 1/bb[i]-1/bb[v], 1/cc[i]-1/cc[v]); if(p.size() == 0) return 0; } return 1; } int main() { int i, j; scanf("%d", &n); for(i = 1; i <= n; i++) scanf("%lf%lf%lf", &aa[i], &bb[i], &cc[i]); for(i = 1; i <= n; i++) { p.clear(); p.push_back( point(inf, inf) ); p.push_back( point(inf, 0) ); p.push_back( point(0, 0) ); p.push_back( point(0, inf) ); if( solve(i) ) puts("Yes"); else puts("No"); } return 0; }


浙公网安备 33010602011771号