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占有 若有人能占有无穷大的面积 则输出 ...
随机推荐
- session第二篇
二 A.application对象 1.application对象实现了用户间数据的共享,可存放全局变量. 2.application对象开始于服务器的启动,终止于服务器的关闭. 3.在用户的前后连接 ...
- IE下设置body{overflow:hidden;}失效Bug
问题重现: <p>There are no scrollbars on this page in sane browsers</p> html, body, p { margi ...
- Redis cli 操作
备份 root@575e8088b5fb:/data# redis-cli LASTSAVE(integer) 1500273743root@575e8088b5fb:/data# redis-cli ...
- 华为手机不打印log解决方法
在拨号界面输入:*#*#2846579#*#* 进入后台设置---log设置---开启AP日志...开关即可
- Nexus 使用配置
Nexus使用的一些基本设置 1.更改中央仓库地址为私服地址 既然我们配置了私服,那么相应的,我们的项目就应该使用Nexus的地址(Public Repository)来下载jar包 1.1.基于PO ...
- python之信号量【Semaphore】
# 互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据,比如 # 一个厕所有3个坑,那么最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去 import ...
- fiddler抓web请求
原理 fiddler抓包原理 fiddler 调试器注册到操作系统因特网服务中,系统所有的网络请求都会走fiddler的代理,所以fiddler才能抓包. Debug traffic from any ...
- 【.Net姿势随记】const 与 readonly 初始化姿势
using System; class P { static readonly int A=B*10; static readonly int B=10; public ...
- rpmdb open failed的解决办法
错误信息如下: “错误:无法从 /var/lib/rpm 打开软件包数据库 CRITICAL:yum.main: Error: rpmdb open failed” ...
- Laravel中用GuzzleHttp
阅读数:14715 今天项目中用到GuzzleHttp,开始不知道怎么用,其实还是很简单的. 直接在项目根目录,输入以下命令 composer require guzzlehttp/guzzle 1 ...