http://acm.hdu.edu.cn/showproblem.php?pid=4946

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

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

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

于是找最大速度点构成的凸包,标记输出

注意由于有重点的存在,一定要标记重点并在求出之后再将其删去,而不是之前直接判定

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include<set>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))
typedef long long LL;
const int maxn=10005;
struct arr {
int x,y,z;
int id;
bool ans;
} a[maxn];
int b[maxn];
bool vis[maxn];
bool cmp(const arr &a, const arr &b) {
return (a.x<b.x) || (a.x==b.x && a.y<b.y);
} bool cmp_z(const arr &a, const arr &b) {
return a.z > b.z;
} bool cmp_id(const arr &a, const arr &b) {
return a.id < b.id;
} int cj(const arr &a, const arr &b, const arr &c) {
return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
} void graham(int n) {
int i,m,k;
if (n < 1)
return ;
if (n == 1) {
a[0].ans =1;
return ;
}
if (n == 2) {
if (a[0].x == a[1].x && a[0].y == a[1].y)
return ;
a[0].ans = a[1].ans = 1;
return ;
}
sort(a,a+n,cmp); clr0(vis);
for (i = 1; i < n; ++i)
if (a[i].x == a[i-1].x && a[i].y == a[i-1].y)
{
vis[i] = 1;
vis[i - 1]=1;
} b[0]=0;
b[1]=1;
b[2]=2;
k=1;
for (i=2; i<n; ++i) {
while (k && cj(a[i],a[b[k]],a[b[k-1]])>=0) --k;
b[++k]=i;
}
m=k;
b[++k]=n-2;
for (i=n-3; i>=0; --i) {
while (k!=m && cj(a[i],a[b[k]],a[b[k-1]])>=0) --k;
b[++k]=i;
}
m=k; m++;
for (i = 0; i < m; ++i)
a[b[i]].ans = 1;
// for (i = 0; i < m; ++i)
// printf("%d %d\n",a[b[i]].x,a[b[i]].y);
for (i = 0;i < n;++i)
if(a[i].ans == 0)
for (int j = 1;j < m;++j)
if(cj(a[b[j]],a[b[j-1]],a[i]) == 0){
a[i].ans = 1;
break;
}
for (i = 0;i < n;++i)
if(vis[i])
a[i].ans = 0;
} int main() {
// freopen("c.in","r",stdin);
// freopen("c.txt","w",stdout);
int i,n;
LL t = 0;
while (~RD(n),n) {
printf("Case #%I64d: ", ++t);
for (i = 0; i < n; ++i) {
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
a[i].id = i;
a[i].ans = 0;
}
if (n == 1) {
if(a[0].z > 0)
puts("1");
else
puts("0");
continue;
}
sort(a, a + n, cmp_z);
if (a[0].z > 0)
{
for (i = 1; i < n; ++i)
if (a[i].z != a[0].z) break;
graham(i);
}
sort(a, a + n, cmp_id);
for (i = 0; i < n; ++i)
if (a[i].ans) putchar('1');
else putchar('0');
puts("");
}
return 0;
}

hdu 4946 凸包注意重点的更多相关文章

  1. HDU 4946 凸包

    给你n个点,具有速度,一个位置如果有其他点能够先到,则不能继续访问,求出里面这些点哪些点是能够无限移动的. 首先我们考虑到,一个速度小的和一个速度大的,速度小的必定只有固定他周围的一定区域是它先到的, ...

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

    题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...

  3. hdu 4946 Area of Mushroom (凸包,去重点,水平排序,留共线点)

    题意: 在二维平面上,给定n个人 每个人的坐标和移动速度v 若对于某个点,只有 x 能最先到达(即没有人能比x先到这个点或者同时到这个点) 则这个点称作被x占有,若有人能占有无穷大的面积 则输出1 , ...

  4. HDU 4946 Area of Mushroom 凸包

    链接:pid=4946">http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点 ...

  5. HDU 4946 Area of Mushroom(构造凸包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...

  6. hdu 4946 Area of Mushroom(凸包)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 Area of Mushroom Time Limit: 2000/1000 MS (Java/Ot ...

  7. HDU 4946 共线凸包

    题目大意: 一些点在一张无穷图上面,每个点可以控制一些区域,这个区域满足这个点到达这个区域的时间严格小于其他点.求哪些点能够控制无穷面积的区域. 题目思路: 速度小的控制范围一定有限. 速度最大当且仅 ...

  8. HDU 4946 Area of Mushroom (几何凸包)

    题目链接 题意:给定n个人,每个人有一个速度v方向任意.如果平面中存在一个点只有某个人到达的时间最短(即没有人比这个人到的时间更短或相同),那么我们定义这个店归这个人管辖,现在问这些人中哪些人的管辖范 ...

  9. HDU 4946 Area of Mushroom 共线凸包

    题意是在二维平面上 给定n个人 每一个人的坐标和移动速度v 若对于某个点,仅仅有 x 能最先到达(即没有人能比x先到这个点或者同一时候到这个点) 则这个点称作被x占有 若有人能占有无穷大的面积 则输出 ...

随机推荐

  1. 奶牛易物小组 Alpha冲刺

    项目地址:https://gitee.com/rrycbar/NenuChange 1 第一天 日期:2018/6/14 1.1 今日完成任务情况以及遇到的问题. 吴建瑜: 完成任务: 1.继续完善购 ...

  2. linux 常用find

    磁盘查找文件内容: find .|xargs grep x find . -exec grep x{} \; 磁盘查找文件名称: find / -name "httpd.conf" ...

  3. MySql LeftJoin On 与 Where的差异

    [MySql LeftJoin On 与 Where的差异] 存在两张表: 分别插入数据: 下面的语句一与语句二会产生不同的结果: 语句一: 结果: 语句二: 结果: 为什么会存在差异,这和on与wh ...

  4. shell获取函数的返回值

    背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的.   定义一个函数 functionname(){      操作内容 ...

  5. tomcat发布webservice

    编写后台代码: package test; import javax.jws.WebParam; import javax.jws.WebService; @WebService public cla ...

  6. springmvc DispatchServlet初始化九大加载策略(一)

    由于篇幅较长,因此分三篇进行讲解: springmvc DispatchServlet初始化九大加载策略(一) springmvc DispatchServlet初始化九大加载策略(二) spring ...

  7. Maven国内镜像-阿里云

    国外的maven下载速度堪忧,大部分国内网络访问都很慢国内的阿里云同样提供了maven的文件镜像使用:1.在maven的setting.xml加入下段代码即可使用阿里云的maven镜像 <mir ...

  8. apache配置防盗链

    1.确保apache已开启rewrite.   2.在.htaccess文件中添加如下: RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://X ...

  9. Linux Doxygen的安装和使用

    一.简介 Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持PHP.C#.注释的语法与Qt-Doc.K ...

  10. Codeforces 599C. Day at the Beach 模拟

    Day at the Beach time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...