题目链接:Area of Mushroom
题意:有一些同学站在二维平面上,每个同学有个速度。平面上的点归第一个到达的同学所有。如果一个同学能到达的点是无穷的是1,否则为0。
题解:找出速度最大的点,求凸包。
1、最大速度为零,所有同学都只能到达有限的点。
2、两个同学在同一个点,速度相同。只能到达有限个点。
代码:
//一开始各种wa,不到错哪了,后来给求凸包是叉积判 <= 改成 < 过了。不是很明白
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <string>
using namespace std;
#define For(i,a) for(i=0;i<a;i++)
#define Foru(i,a,b) for(i=a;i<=b;i++)
#define Ford(i,a,b) for(i=a;i>=b;i--)
#define clr(ar,vel) memset(ar,vel,sizeof(ar))
#define PB push_back
typedef long long ll;
const int maxint = 0x7fffffff;
const ll maxll = 1LL<<60;
const double EPS = 1e-10;
// 二维向量类
double add( double a, double b){
if( abs(a+b) < EPS * ( abs(a) + abs(b))) return 0;
return a+b;
}
struct P{
double x, y;
int num;
P() {}
P(double x, double y) : x(x), y(y) {}
P operator + (P p){ return P(add(x, p.x), add(y, p.y));}
P operator - (P p){ return P(add(x, -p.x), add(y, -p.y));}
P operator * (double d){ return P(x*d, y*d);}
bool operator < (const P& a) const {
if( x != a.x) return x < a.x;
else return y < a.y;
}
double dot(P p){ return add(x*p.x, y*p.y);}
double det(P p) { return add( x*p.y, -y*p.x);}
};
P p[50010];
int n;
vector<P> convex_hull(P *ps, int n){
sort(p, p+n);
int k = 0;
vector<P> qs(n*2);
// down
for(int i = 0; i < n; i ++){
while( k > 1 && (qs[k-1] - qs[k-2]).det(ps[i] - qs[k-1]) < 0) k--;
qs[k++] = ps[i];
}
// up
for(int i = n-2, t = k; i >= 0; i --){
while( k > t && (qs[k-1] - qs[k-2]).det(ps[i] - qs[k-1]) < 0) k--;
qs[k++] = ps[i];
}
qs.resize(k-1);
return qs;
}
double dist(P p, P q){
return (p-q).dot(p-q);
}
struct node {
int x, y, vel;
void scan(){ scanf("%d%d%d",&x,&y,&vel);}
}node[510];
int ans[510], vis[510];
int main(){
int cas = 1;
while(~scanf("%d",&n)) {
if( n == 0 ) break;
int max_speed = 0, cnt = 0;
memset( ans, 0, sizeof(ans));
memset( vis, 0, sizeof(vis));
for(int i = 0; i < n; i ++) {
node[i].scan();
max_speed = max(max_speed, node[i].vel);
}
if( max_speed == 0 ) {
printf("Case #%d: ",cas++);
for(int i = 0; i < n; i ++) printf("%d",ans[i]);
printf("\n");
continue;
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
if( node[i].x == node[j].x && node[i].y == node[j].y && node[i].vel == node[j].vel && i != j) vis[i] = vis[j] = 1;
}
}
for(int i = 0; i < n; i ++) if( node[i].vel == max_speed){
int flag = 0;
for(int j = 0; j < i; j ++){
if( node[i].x == node[j].x && node[i].y == node[j].y && node[i].vel == node[j].vel && i != j) flag = 1;
}
if( flag ) continue;
p[cnt].x = node[i].x;
p[cnt].num = i;
p[cnt++].y = node[i].y;
}
// for(int i = 0; i < cnt; i ++) cout << p[i].num << ' ' ;cout << endl;
if( cnt != 1 && max_speed != 0) {
vector<P> qs = convex_hull(p, cnt);
double res = 0;
// for(int i = 0; i < qs.size(); i ++) cout << qs[i].num << ' '; cout << endl;
for(int i = 0; i < qs.size(); i ++) ans[qs[i].num] = 1;
}
else ans[p[0].num] = max_speed? 1 : 0;
for(int i = 0; i < n; i ++) if( vis[i] ) ans[i] = 0;
printf("Case #%d: ",cas++);
for(int i = 0; i < n; i ++) printf("%d",ans[i]);
printf("\n");
}
return 0;
}