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. vim使用方法:

    vim使用方法: 模式: 编辑模式.未编辑模式.命令行模式 i 插入形式进入编辑模式 a 增加 o 下行编辑 O 上行插入 : 进入命令行模式 esc 退出编辑模式 wq 保存文件 yy 复制 p 粘 ...

  2. pyspark dataframe 格式数据输入 做逻辑回归

    该方法好处是可以调节阈值,可调参数比其他形式模型多很多. [参照]http://blog.csdn.net/u013719780/article/details/52277616 [3种模型效果比较: ...

  3. 手动安装yii2.0-redis扩展

    1.点击下载:yii2.0-redis扩展 2.把下载的扩展文件放到vendor/yiisoft/下,命名为yii2-redis 3.修改vender/yiisoft/下的extensions.php ...

  4. SmartOS技术常见问题

    什么是默认用户名和密码? 当SmartOS Live Image第一次启动时,系统将提示您设置root密码. 如果在不导入Zpool的情况下启动SmartOS,则需要默认的root密码. 当使用noi ...

  5. Spring WebMVC 4.1返回json时 406(Not Acceptable)

    1.问题现象Tomcat7+Spring4.1.4,返回json字符串时发生406错误 The resource identified by this request is only capable ...

  6. 自定义事件 js

    // 原理如下// 创建 类型为HTMLEvents的事件 var evt = document.createEvent("HTMLEvents"); // 初始化 自定义eee ...

  7. swift - VFL

    1.VFL语法总结: //(1)“H”表示水平方向,“V”表示垂直方向 //(2)“|”表示父视图的边界 //(3)“[]”表示这是一个视图UIView的子类,可以组合多个条件,条件用"() ...

  8. actionBar_Tab导航

    actionBar配合碎片使用  初始化actionBar要注意设置actionbar的导航模式 package com.qf.actionbar04_tab; import java.io.File ...

  9. discuz回贴通知插件实现-插件后台管理配置

    1.登出discuz后台,再次设计插件 2.使用变量    

  10. 搭建事务管理转账案例的环境(强调:简化开发,以后DAO可以继承JdbcDaoSupport类)

    1. 步骤一:创建WEB工程,引入需要的jar包 * IOC的6个包 * AOP的4个包 * C3P0的1个包 * MySQL的驱动包 * JDBC目标2个包 * 整合JUnit测试包2.步骤二:创建 ...