HDU 4946 Area of Mushroom 求凸包边上的点

点击打开链接

Area of Mushroom

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1257    Accepted Submission(s): 307

Problem Description

Teacher Mai has a kingdom with the infinite area.

He has n students guarding the kingdom.

The i-th student stands at the position (xi,yi), and his walking speed is vi.

If a point can be reached by a student, and the time this student walking to this point is strictly less than other students, this point is in the charge of this student.

For every student, Teacher Mai wants to know if the area in the charge of him is infinite.

Input

There are multiple test cases, terminated by a line "0".

For each test case, the first line contains one integer n(1<=n<=500).

In following n lines, each line contains three integers xi,yi,vi(0<=|xi|,|yi|,vi<=10^4).

Output

For each case, output "Case #k: s", where k is the case number counting from 1, and s is a string consisting of n character. If the area in the charge of the i-th student isn‘t infinite, the i-th character is "0", else it‘s "1".

Sample Input

3
0 0 3
1 1 2
2 2 1
0

Sample Output

Case #1: 100

Source

2014 Multi-University Training Contest 8

给你n个点的坐标和速度,如果一个点能够到达无穷远处,且花费的时间是最少的,则此点输出1,否则输出0.

每个点向外都是以园的形式向外拓展的,所以只有速度最大的才能到达无穷远处,但是并不是所有速度为最大的点都能到到无穷远处。

将速度最大的所有点做一个凸包,凸包内的点肯定不能到达无穷远处,凸包上的点才满足条件。

//109MS	292K
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct Point
{
    int x,y,k,id,vis,flag;
    Point(int x=0,int y=0):x(x),y(y) {} //构造函数
};
typedef Point Vector;
Point operator-(Point A,Point B)
{
    return Point(A.x-B.x,A.y-B.y);
}
int Cross(Point A,Point B)
{
    return A.x*B.y-A.y*B.x;
}
int cmp1(Point a,Point b)
{
    if(a.k==b.k)
    {
        if(a.x==b.x)return a.y<b.y;
        return a.x<b.x;
    }

    return a.k>b.k;
}
int cmp2(Point a,Point b)
{
    return a.id<b.id;
}

int ConvexHull(Point* p,int n,Point* ch)//求凸包
{
    int m=0;
    for(int i=0;i<n;i++)
    {
        while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--;
        ch[m++]=p[i];
    }
    int k=m;
    for(int i=n-2;i>=0;i--)
    {
        while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--;
        ch[m++]=p[i];
    }
    if(n>1)m--;
    return m;
}

int main()
{
        int n,cas=1;
        while(scanf("%d",&n),n)
        {
            Point P[507],ch[507],v[507];
            int i;
            for(i=0; i<n; i++)
            {
                scanf("%d%d%d",&P[i].x,&P[i].y,&P[i].k);
                P[i].id=i;P[i].vis=P[i].flag=0;
            }
            sort(P,P+n,cmp1);
            v[0]=P[0];
            for(i=1;i<n;i++)
                if(P[i].k!=P[i-1].k)break;
                else
                {
                    v[i]=P[i];
                    if(P[i].x==P[i-1].x&&P[i].y==P[i-1].y)P[i].vis=v[i].vis=P[i-1].vis=v[i-1].vis=1;
                }
            int num=i;
            int m=ConvexHull(v,num,ch);
            if(P[0].k==0)num=0;
            for(i=0;i<num;i++)
                for(int j=0;j<m;j++)
                    if(Cross(ch[j]-ch[(j+1)%m],ch[j]-P[i])==0)
                    {
                        if(!P[i].vis)P[i].flag=1;
                        break;
                    }
            sort(P,P+n,cmp2);
            printf("Case #%d: ",cas++);
            for(int i=0;i<n;i++)
                printf("%d",P[i].flag);
            printf("\n");
        }
    return 0;
}

HDU 4946 Area of Mushroom 求凸包边上的点

时间: 2024-12-18 22:29:50

HDU 4946 Area of Mushroom 求凸包边上的点的相关文章

HDU 4946 Area of Mushroom(凸包)

HDU 4946 Area of Mushroom(凸包) ACM 题目地址:HDU 4946 Area of Mushroom 题意: 给定n个人,每个人的坐标和移动速度v,若对于某个点,只有 x 能最先到达(即没有人能比x先到这个点或者同时到这个点),则这个点称作被x占有,若有人能占有无穷大的面积 则输出1 ,否则输出0. 分析: 到最后只有速度最大的点才有可能获得无穷大的面积.所以只要考虑速度最大的点. 很明显,只有这些点的凸包边上的点才能获得无穷大的面积. 所以求凸包边上的点就行了. 有

HDU 4946 Area of Mushroom 共线凸包

题意是在二维平面上 给定n个人 每个人的坐标和移动速度v 若对于某个点,只有 x 能最先到达(即没有人能比x先到这个点或者同时到这个点) 则这个点称作被x占有 若有人能占有无穷大的面积 则输出1 ,否则输出0 思路: 1.把所有点按速度排个序,然后把不是最大速度的点去掉 剩下的点才有可能是占有无穷大的面积 2.给速度最大的点做个凸包,则只有在凸包上的点才有可能占有无穷大 若一个位置有多个人,则这几个人都是不能占有无穷大的. 凸包上边里共线的点是要保留的,, 附赠一波数据 #include <cs

HDU 4946 Area of Mushroom(凸包)

如果一个人能统治无穷远处,那么他的速度一定是最大的.除了那几种很坑的数据,比如同一个点速度相同的两个人.永远都是不可能.所以你要处理出来所有速度最大的点,然后用他们构成一个凸包,你把端点的点求出来了,还得判断一下在边上的情况.然后顶点和在边上的点所构成的就是可以到达无穷远处的人. PS:抄了芳姐的模版..哈哈哈 Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/

HDU 4946 Area of Mushroom 凸包 第八次多校

Problem Description Teacher Mai has a kingdom with the infinite area. He has n students guarding the kingdom. The i-th student stands at the position (xi,yi), and his walking speed is vi. If a point can be reached by a student, and the time this stud

【凸包】HDU 4946 Area of Mushroom

注意: 1.重合的点 2.速度为0的点 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <ctype.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> using

hdu 4946 Area of Mushroom

题意: 在二维平面上,给定n个人 每个人的坐标和移动速度v 若对于某个点,只有 x 能最先到达(即没有人能比x先到这个点或者同时到这个点) 则这个点称作被x占有,若有人能占有无穷大的面积 则输出1 ,否则输出0 思路: 1.把所有点按速度排个序,然后把不是最大速度的点去掉 剩下的点才有可能是占有无穷大的面积 2.给速度最大的点做个凸包,则只有在凸包上的点才有可能占有无穷大 若一个位置有多个人,则这几个人都是不能占有无穷大的. 凸包上边里共线的点是要保留的. #易错点: 1.凸包边上要保留共线的点

HDU 4946 Area of Mushroom(构造凸包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移动,对于平面上任意一点,假设有唯一一个点pi从初始的位置到这个点的时间最短,那么就说平面上的这个点是属于pi这点管辖的.现在要你判断pi管辖的范围是不是无穷大的,如果是输出1,否则输出0: 首先大致的方法就是构造凸包,不过要遵循一下前提: 一定是只考虑速度最大的点,然后,如果两个点所在的位置与速度都

[hdu-4946] Area of Mushroom 计算几何 凸包

大致题意: 平面上有n个人,给你每个人的坐标和一个速度v,如果某个人比其他所有人都先到达某点,则该点就被这个人掌控,求谁掌控者无限大的面积. 首先 速度最大的人,抛弃其他人,速度小的人必定无法得到无限的面积. 然后 所有速度最大的人建凸包,则凸包上节点的人和凸包边上的人必定有无限的面积,凸包内部的人必定没有,因为速度都相等. ps:建凸包时不能直接将叉积的<=该为<来构建边上有点的凸包,因为有重点. 最后将所有得到的人中有重合的全部去除,最后留下的人掌控的面积无限 #include<cs

(hdu 7.1.7)Wall(求凸包的周长——求将所有点围起来的最小凸多边形的周长)

题目: Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 119 Accepted Submission(s): 47   Problem Description Once upon a time there was a greedy King who ordered his chief Architect to build a wa