hdu 4946 凸包注意重点
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 凸包注意重点的更多相关文章
- HDU 4946 凸包
给你n个点,具有速度,一个位置如果有其他点能够先到,则不能继续访问,求出里面这些点哪些点是能够无限移动的. 首先我们考虑到,一个速度小的和一个速度大的,速度小的必定只有固定他周围的一定区域是它先到的, ...
- HDU 4946 Area of Mushroom 凸包 第八次多校
题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...
- hdu 4946 Area of Mushroom (凸包,去重点,水平排序,留共线点)
题意: 在二维平面上,给定n个人 每个人的坐标和移动速度v 若对于某个点,只有 x 能最先到达(即没有人能比x先到这个点或者同时到这个点) 则这个点称作被x占有,若有人能占有无穷大的面积 则输出1 , ...
- HDU 4946 Area of Mushroom 凸包
链接:pid=4946">http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点 ...
- HDU 4946 Area of Mushroom(构造凸包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...
- hdu 4946 Area of Mushroom(凸包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 Area of Mushroom Time Limit: 2000/1000 MS (Java/Ot ...
- HDU 4946 共线凸包
题目大意: 一些点在一张无穷图上面,每个点可以控制一些区域,这个区域满足这个点到达这个区域的时间严格小于其他点.求哪些点能够控制无穷面积的区域. 题目思路: 速度小的控制范围一定有限. 速度最大当且仅 ...
- HDU 4946 Area of Mushroom (几何凸包)
题目链接 题意:给定n个人,每个人有一个速度v方向任意.如果平面中存在一个点只有某个人到达的时间最短(即没有人比这个人到的时间更短或相同),那么我们定义这个店归这个人管辖,现在问这些人中哪些人的管辖范 ...
- HDU 4946 Area of Mushroom 共线凸包
题意是在二维平面上 给定n个人 每一个人的坐标和移动速度v 若对于某个点,仅仅有 x 能最先到达(即没有人能比x先到这个点或者同一时候到这个点) 则这个点称作被x占有 若有人能占有无穷大的面积 则输出 ...
随机推荐
- java 可伸缩阻塞队列实现
最近一年多写的最虐心的代码.必须好好复习java并发了.搞了一晚上终于测试都跑通过了,特此纪念,以资鼓励! import java.util.ArrayList; import java.util.L ...
- linux替换字符串的几种方法
1. 基本替换:s/str1/str2/ 替换当前行第一个str1为str2:s/str1/str2/g 替换当前行所有str1为str2:n,$s/str1/str2/ 替换第 n 行开始到最后一行 ...
- https 证书传递、验证和数据加密、解密过程解析
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...
- Web标准:二、一列布局
知识点: 1.一列固定宽度 2.一列固定宽度居中 3.一列自适应宽度 4.一列自适应宽度居中 5.一列二至多块布局 1)一列固定宽度 下图是定义了一个高300px,宽400px,颜色是#99FFc ...
- 对实体类的CRUD操作
--------------------siwuxie095 对实体类的 CRUD 操作 1.创建数据库和表 (1)创建一个 MySQL 连接:mybatis_conn (2)创建一个数据库:myba ...
- 转 Appium for Mac 环境准备篇
转发地址:http://www.cnblogs.com/oscarxie/p/3894559.html 1. 爬墙因为后续安装过程中可能会碰到墙的问题,所以首先得解决爬墙的问题.我的方便,公司提供代理 ...
- app电池续航上&&下--Android自动化测试学习历程
章节:自动化基础篇——电池续航自动化测试上&&下 主要讲解内容及笔记: 一.影响手机电量的因素和理论: 下面是一个表格:当今主流手机显示屏技术.机型与功耗对照表: 技术 类型 ...
- swift 官方文档
swift 官方文档 https://swift.org/blog/
- 15-matlab矩阵运用
from scipy.spatial import Delaunay from mpl_toolkits.mplot3d import Axes3D import numpy as np import ...
- php 的 PHPExcel1.8.0 使用教程
PHPExcel是用来操作Office Excel文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格. 一.下载PHPExcel http: ...