一开始不知道管辖区域无限是什么意思。。。
速度最大的几个学生生成一个图,求凸包。
#include<vector>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 550
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define mset(x) memset(x,0,sizeof(x))
char s[maxn];
struct Point {
int x,y,v,id,vis;
Point(int x=0, int y=0):x(x), y(y){}
bool operator<( const Point& tmp ){
if(v == tmp.v)
return x < tmp.x || ( x==tmp.x && y<tmp.y );
return v > tmp.v;
}
}st[maxn], P[maxn], ch[maxn];
typedef Point Vector;
int Cross(Vector A, Vector B){return A.x*B.y - A.y*B.x;}
Vector operator- (Point A, Point B){return Point(A.x-B.x, A.y-B.y);}
int ConvexHull(Point* P, int n, Point* ch){//Andrew算法,cross==0的也能包含进来,但是要排除重复点
int m=0;
for(int i=0;i<n;i++){
while( m>1 && Cross(ch[m-1]-ch[m-2], P[i]-ch[m-2]) < 0 )
m--;
ch[m++] = P[i];
}
int k=m;
for(int i=n-2; i>=0; i--){
while( m>k && Cross(ch[m-1]-ch[m-2], P[i]-ch[m-2]) < 0 )
m--;
ch[m++] = P[i];
}
if(n>1) m--;
return m;
}
void init(int n){
for(int i=0;i<n;i++){
s[i]='0';
st[i].vis=0;
P[i].vis=0;
}
s[n]='\0';
}
int main(){
// freopen("a.txt","r",stdin);
// freopen(".out","w",stdout);
int n, kase=1;
while(cin>>n && n){
init(n);
for(int i=0;i<n;i++){
cin >> st[i].x >> st[i].y >> st[i].v;
st[i].id = i;
}
printf("Case #%d: ",kase++);
sort(st,st+n);
if(st[0].v == 0)//如果最大速度是0,则没有管辖区域无限的点
{
puts(s);
continue;
}
int num=0, i=0;
while(i<n){
if(st[i].v<st[0].v) //只枚举最大速度的点
break;
int l=1;
while(i+l<n && st[i+l].v == st[0].v && st[i].x==st[i+l].x && st[i].y==st[i+l].y){
//即使是多重点,也要把这个点加到P里面去。但只要加一个
l++;
}
P[num] = st[i];
if(l>1) P[num].vis = 1;
num++;
i+=l;
}
int m=ConvexHull(P, num, ch);
for(int i=0;i<m;i++)
if(!ch[i].vis)
s[ch[i].id] = '1';
puts(s);
}
return 0;
}