怎么说呢,,感觉这题在比赛能写出来的几率为0,,,哎自己真的太菜了
贴一份数据
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=1111;
const double eps=1e-8;
int sgn(double x)
{
if(fabs(x)<eps)
return 0;
if(x<0)
return -1;
else
return 1;
}
struct Point
{
double x,y,v;
int index;
int val;
Point(){}
Point(double _x,double _y)
{
x=_x;
y=_y;
}
Point operator -(const Point &b)const
{
return Point(x-b.x,y-b.y);
}
double operator ^(const Point &b)const
{
return x*b.y-y*b.x;
}
double operator *(const Point &b)const
{
return x*b.x+y*b.y;
}
bool operator ==(const Point &b)const
{
return
x==b.x&&y==b.y&&v==b.v;
}
};
struct Line
{
Point s,e;
Line(){}
Line(Point _s,Point _e)
{
s=_s;
e=_e;
}
};
Point p[maxn];
Point p1[maxn];
int cont;
int Stack[maxn];
int top;
int n;
double dist(Point a,Point b)
{
return sqrt((a-b)*(a-b));
}
bool cmp(Point a,Point b)
{
int ans=sgn((a-p[0])^(b-p[0]));
if(ans==1)
return true;
else if(ans==0)
return dist(a,p[0])<dist(b,p[0]);
else
return false;
}
void graham()
{
for(int i=0;i<cont;i++)
{
if(p[i].x<p[0].x||(p[i].x==p[0].x&&p[i].y<p[0].y))
swap(p[i],p[0]);
}
sort(p+1,p+cont,cmp);
if(cont==1)
{
Stack[0]=0;
top=1;
}
else if(cont==2)
{
Stack[0]=0;
Stack[1]=1;
top=2;
}
else
{
Stack[0]=0;
Stack[1]=1;
top=2;
for(int i=2;i<cont;i++)
{
while(top>1&&sgn((p[Stack[top-1]]-p[Stack[top-2]])^(p[i]-p[Stack[top-2]]))<=0)
top--;
Stack[top++]=i;
}
}
}
bool OnSeg(Point P,Line L)
{
return
sgn((L.s-P)^(L.e-P)) == 0 &&
sgn((P.x - L.s.x) * (P.x - L.e.x)) <= 0 &&
sgn((P.y - L.s.y) * (P.y - L.e.y)) <= 0;
}
int inConvexPoly(Point a,Point p[],int n)
{
for(int i = 0;i < n;i++)
{
if(sgn((p[i]-a)^(p[(i+1)%n]-a)) < 0)return -1;
else if(OnSeg(a,Line(p[i],p[(i+1)%n])))return 0;
}
return 1;
}
Point p3[maxn];
bool cmp1(Point a,Point b)
{
return a.index<b.index;
}
int main()
{
int num=0;
while(1)
{
cin>>n;
if(n==0)
break;
int min1=0;
for(int i=0;i<n;i++)
{
scanf("%lf %lf %lf",&p1[i].x,&p1[i].y,&p1[i].v);
p1[i].index=i+1;
p1[i].val=-1;
if(p1[i].v>min1)
min1=p1[i].v;
}
if(min1==0)
{
num++;
printf("Case #%d: ",num);
for(int i=0;i<n;i++)
cout<<0;
cout<<endl;
continue;
}
//cout<<min1<<endl;
cont=0;
for(int i=0;i<n;i++)
{
if(p1[i].v==min1)
{
int fl=0;
for(int j=0;j<cont;j++)
{
if(p[j]==p1[i])
{
p1[i].val=0;
p1[p[j].index-1].val=0;
fl=1;
break;
}
}
if(fl==0)
{
p[cont].x=p1[i].x;
p[cont].y=p1[i].y;
p[cont].v=p1[i].v;
p[cont].index=p1[i].index;
//cout<<p[cont].x<<"*"<<p[cont].y<<endl;
cont++;
}
}
}
graham();
for(int i=0;i<top;i++)
{
if(p1[p[Stack[i]].index-1].val==-1)
p1[p[Stack[i]].index-1].val=1;
}
for(int i=0;i<top;i++)
{
p3[i]=p[Stack[i]];
//cout<<p3[i].x<<"*"<<p3[i].y<<endl;
}
for(int i=0;i<cont;i++)
{
if(inConvexPoly(p[i],p3,top)==0&&p1[p[i].index-1].val!=0)
{
p1[p[i].index-1].val=1;
}
}
for(int i=0;i<n;i++)
{
if(p1[i].val==-1)
p1[i].val=0;
}
/*for(int i=0;i<n;i++)
{
if(p1[i].val==0)
continue;
for(int j=0;j<top;j++)
{
if(p1[i]==p3[j])
{
p1[i].val=1;
break;
}
else if(p1[i].v==min1)
{
if(inConvexPoly(p1[i],p3,top)==0)
{
p1[i].val=1;
break;
}
else
p1[i].val=0;
}
else
p1[i].val=0;
}
}*/
num++;
printf("Case #%d: ",num);
for(int i=0;i<n;i++)
cout<<p1[i].val;
cout<<endl;
}
return 0;
}
/*
5
0 0 6
3 3 6
1 1 6
0 3 6
3 0 6
9
0 0 3
0 1 3
0 2 3
1 0 3
1 1 3
1 2 3
2 0 3
2 1 3
2 2 3
3
0 0 3
1 1 2
2 2 1
3
0 0 3
0 0 3
0 0 3
8
1 1 3
2 1 3
3 1 3
3 2 3
2 2 3
1 2 3
1 3 3
3 3 3
4
0 0 3
0 3 3
3 0 3
1 1 3
6
0 0 1
-1 0 1
1 0 1
0 1 1
0 -1 1
0 -1 1
*/