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. ssh 设置反向代理

    远程主机上/etc/ssh/sshd_config中,开启 GatewayPorts yes systemctl reload sshd 本地: ssh -CqTnN -R 0.0.0.0:9000: ...

  2. sar命令详细信息

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...

  3. spring-boot PageHelper

    分页插件PageHelper 参看了pagehelper-spring-boot,使用起来非常放方便,关于更多PageHelper可以点击https://github.com/pagehelper/M ...

  4. Maven命令行使用 mvn clean package

    先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令:  mvn clean package 执行结果如下: [INFO] Scanning ...

  5. nginx的Mainline version、Stable version、Legacy version

    Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版 ...

  6. 使用git提交代码到GitHub

    0.下载Git Bash,在Windows系统可以用Git Bash通过简单的命令将代码提交到GitHub1.打开项目所在的文件夹,右键,"Git Bash Here"2.初次使用 ...

  7. phpStudy4——前端页面使用Ajax请求并解析php返回的json数据

    项目需求: 在html页面显示所有用户列表信息. 需求分析: 1. html页面使用ajax向后端php请求用户数据 2. php脚本查询数据库,并将查询后的结果以json格式返回前端html页面 3 ...

  8. C#.net随机数函数

    (1)Random rnd = new Random(); int rndNum = rnd.Next();           //int 取值范围内的随机数 int rndNum = rnd.Ne ...

  9. GridView上同时定义了 DataSource 和 DataSourceId

    VS平台下ASP.NET网站的建立,我们常常要跟数据库打交道,获取数据库的信息,通过GridView控件进行显示,需要为GridView指定 DataSourceId或者DataSource,切忌不可 ...

  10. Pull to RefreshListView 添加HeaderView

    使用listView.addHeaderView(view) 可以在 listView 上方添加一个view视图 ,使listView和这个view连接在一起 效果上看上去是一个整体 一般用于上拉刷新 ...