题意:
某个人可以先于别人到达一个区域,那么这个区域就是他的,判断是否一个人的区域是无穷多个的,如果是那么他就是输出1否则输出0.
解法:
每个人的行动范围是以自己点为中心的圆。
1. 首先确定的是,速度慢的人迟早要被速度快的人覆盖掉,所以速度慢的人不考虑。
2. 其次并不是所有速度快的点,就一定有无穷的趋于。如果他的周围全是速度比他快的人,他就玩完了。
3. 我们可以发现在凸包上的点,是优于其他点。
trick点有三:
一:同位置的两个点?
根据题意他们不可能出现优先占有的可能,区域并不是无穷多的。
二: 最大速度为0?
他们还能占有毛区域啊?所有的人都是0了,这个trick点有点坑。
三:在凸包的边上也是符合要求的点。
#看一下创建时间就知道我写这个题有点悲剧了~不知道错误在哪里,换成别人的模板就好使,我的天哪,气死我了。~
/*************************************************************************
> File Name: hdu4946.cpp
> Author: cy
> Mail: 1002@qq.com
> Created Time: 2014/8/17 15:03:44
************************************************************************/
#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define maxn 5000+5
#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)
#define ull unsigned long long
#define ll long long
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
struct point
{
int x,y,v;
int flag;
int vis;
int ip;
}val[maxn],ch[maxn],p[maxn];
bool cmp(point a,point b)
{
if(a.v==b.v){
if(a.y==b.y)return a.x<b.x;
return a.y<b.y;
}
return a.v>b.v;
}
bool cmm(point a,point b)
{
return a.ip<b.ip;
}
int mult(point sp,point ep,point op){
return (sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y);
}
int Graham(point *p,point *ch,int n)
{
int i,m=0,k;
for(i=0;i<n;i++)
{
while(m>1&&mult(ch[m-1],p[i],ch[m-2])<=0)m--;
ch[m++]=p[i];
}
k=m;
for(i=n-2;i>=0;i--)
{
while(m>k&&mult(ch[m-1],p[i],ch[m-2])<=0)m--;
ch[m++]=p[i];
}
if(n>1)m--;
return m;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int i,j,k;
int n,m;
int T=0;
while(cin>>n&&n)
{
rep(i,n){
cin>>val[i].x>>val[i].y>>val[i].v;
val[i].vis=0;
val[i].flag=0;
val[i].ip=i;
}
sort(val,val+n,cmp);
for(i=1;i<n;i++)
{
if(val[i].v!=val[i-1].v)break;
if(val[i].x==val[i-1].x&&val[i].y==val[i-1].y){
val[i].vis=1;
val[i-1].vis=1;
}
}
int len=i;
for(i=0;i<len;i++){
p[i]=val[i];
}
if(val[0].v==0)len=0;
m=Graham(p,ch,len);
rep(i,len){
rep(j,m)
{
if(val[i].vis)break;
if(mult(ch[j],ch[(j+1)],val[i])==0)
{
val[i].flag=1;
break;
}
}
}
sort(val,val+n,cmm);
printf("Case #%d: ",++T);
rep(i,n)printf("%d",val[i].flag);
printf("\n");
}
return 0;
}