【POJ 1755】n*n的半平面交算法 适用于不等式交

本文深入探讨了人工智能在音视频处理领域的最新进展,包括音视频编解码、AR特效、直播流媒体等关键技术和应用案例,展示了AI如何推动音视频行业的发展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Triathlon
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 5519 Accepted: 1405

Description

Triathlon is an athletic contest consisting of three consecutive sections that should be completed as fast as possible as a whole. The first section is swimming, the second section is riding bicycle and the third one is running. 

The speed of each contestant in all three sections is known. The judge can choose the length of each section arbitrarily provided that no section has zero length. As a result sometimes she could choose their lengths in such a way that some particular contestant would win the competition. 

Input

The first line of the input file contains integer number N (1 <= N <= 100), denoting the number of contestants. Then N lines follow, each line contains three integers Vi, Ui and Wi (1 <= Vi, Ui, Wi <= 10000), separated by spaces, denoting the speed of ith contestant in each section.

Output

For every contestant write to the output file one line, that contains word "Yes" if the judge could choose the lengths of the sections in such a way that this particular contestant would win (i.e. she is the only one who would come first), or word "No" if this is impossible.

Sample Input

9
10 2 6
10 7 3
5 6 7
3 2 7
6 2 6
3 5 7
8 4 6
10 4 2
1 8 7

Sample Output

Yes
Yes
Yes
No
No
No
Yes
No
Yes

Source



#define DeBUG
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <set>
#include <sstream>
#include <map>
#include <list>
#include <bitset>
using namespace std ;
#define zero {0}
#define INF 0x3f3f3f3f
#define EPS 1e-10
#define TRUE true
#define FALSE false
typedef long long LL;
const double PI = acos(-1.0);
//#pragma comment(linker, "/STACK:102400000,102400000")
inline int sgn(double x)
{
    return fabs(x) < EPS ? 0 : (x < 0 ? -1 : 1);
}
#define N 100005
// Point class
struct Point;
typedef Point Vec;
struct Point
{
    double x, y;
    Point () {}
    Point(double a, double b)
    {
        x = a;
        y = b;
    }
};
void initial(Point p[], int &pCnt) //联机算法,初始化无限大平面,切割多边形从1开始
{
    p[1] = Point(0, 0);
    p[2] = Point(0, 1000000);
    p[3] = Point(1000000, 1000000);
    p[4] = Point(1000000, 0);
    p[5] = p[1];
    p[0] = p[4];
    pCnt = 4;
}
Point intersect(Point x, Point y, double a, double b, double c)
{
    double u = fabs(a * x.x + b * x.y + c);
    double v = fabs(a * y.x + b * y.y + c);
    return Point( (x.x * v + y.x * u) / (u + v) , (x.y * v + y.y * u) / (u + v) );
}
int cut(Point p[], int &pCnt, double a, double b , double c) //p为多边形数组
{
    Point q[1000];//队列最大长度
    int  curCnt = 0;
    for (int i = 1; i <= pCnt; ++i)
    {
        if (sgn(a * p[i].x + b * p[i].y + c) > 0)q[++curCnt] = p[i];
        //注意这里一定是大于0,而不是大于等于0,根据题意变化,下面的本来就没有=
        else
        {
            if (sgn(a * p[i - 1].x + b * p[i - 1].y + c) > 0)
            {
                q[++curCnt] = intersect(p[i], p[i - 1], a, b, c);
            }
            if (sgn(a * p[i + 1].x + b * p[i + 1].y + c) > 0)
            {
                q[++curCnt] = intersect(p[i], p[i + 1], a, b, c);
            }
        }
    }
    for (int i = 1; i <= curCnt; ++i)
        p[i] = q[i];
    p[curCnt + 1] = q[1];
    p[0] = p[curCnt];
    pCnt = curCnt;
    return curCnt;
}
struct Node
{
    double x, y, z;
};
Node person[200];
int main()
{
#ifdef DeBUGs
    freopen("C:\\Users\\Sky\\Desktop\\1.in", "r", stdin);
#endif
    int n;
    while (scanf("%d", &n) + 1)
    {
        for (int i = 0; i < n; i++)
        {
            scanf("%lf%lf%lf", &person[i].x, &person[i].y, &person[i].z);
        }
        Point p[200];
        int num;
        double a, b, c;
        for (int i = 0; i < n; i++)
        {
            bool flag = true;
            initial(p,num);
            for (int j = 0; j < n; j++)
            {
                if (i == j)
                    continue;
                c = 1 / person[j].z - 1 / person[i].z;
                a = 1 / person[j].x - 1 / person[i].x;
                b = 1 / person[j].y - 1 / person[i].y;
                if (cut(p, num, a, b, c) <= 2)
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值