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;
}

 

posted @ 2012-09-07 14:17  To be an ACMan  Views(237)  Comments(0)    收藏  举报