hdu4946 Area of Mushroom

来源:互联网 发布:机器人语音对话软件 编辑:程序博客网 时间:2024/05/16 14:53

//凸包,注意凸包边上的点也要包含进去,然后最大速度为0的话都输出0

#include <cstdio>#include <cstring>#include <algorithm>#include<iostream>using namespace std;bool fl[555],damn[555],inc[555];struct P{         int in,x,y,v;         friend bool operator < (P a,P b){                 if (a.v>b.v) return 1;                 if (a.v==b.v){                       return (a.x<b.x)||(a.x==b.x&&a.y<b.y);                 }                 return 0;         }}p[555];P ch[555];P operator  - (P A, P B){      P c;      c.x=A.x-B.x;      c.y=A.y-B.y;      return c;}int cross(P A,P B){      return A.x*B.y-A.y*B.x;}int conv(int m){      int mm=0;      memset(inc,0,sizeof(inc));      for (int i=0;i<m;i++){              while (mm>1&&cross(ch[mm-1]-ch[mm-2],p[i]-ch[mm-2])<0) mm--;              ch[mm++]=p[i];      }      for (int i=1;i<mm;i++) inc[ch[i].in]=1;      int k=mm;      for (int i=m-2;i>=0;i--){              while (mm>k&&cross(ch[mm-1]-ch[mm-2],p[i]-ch[mm-2])<0) mm--;              if (!inc[p[i].in])                      ch[mm++]=p[i];      }      if (m>1) mm--;      return mm;}int main(){       //freopen("1.in","r",stdin);       int n,m,ca=1;       while (scanf("%d",&n),n){               for (int i=0;i<n;i++){                     scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v);                     p[i].in=i;               }                printf("Case #%d: ",ca++);               sort(p,p+n);               if(p[0].v==0){for (int i=0;i<n;i++)printf("0");printf("\n");continue;}               memset(fl,0,sizeof(fl));               memset(damn,0,sizeof(damn));               m=1;               for (int i=1;i<n;i++){                        if (p[i].v!=p[i-1].v) break;                        if (p[i].x==p[i-1].x&&p[i].y==p[i-1].y){                                damn[p[i].in]=damn[p[i-1].in]=1;                        }                }                for (int i=1;i<n;i++){                      if (p[i].v!=p[i-1].v) break;                      if (p[i].x!=p[i-1].x||p[i].y!=p[i-1].y){                             p[m++]=p[i];                      }                }                int chs;              chs=conv(m);               for (int i=0;i<chs;i++){                        fl[ch[i].in]=1;               }               for (int i=0;i<n;i++){                     if (fl[i]==1&&!damn[i]) printf("1");                     else printf("0");               }               printf("\n");       }       return 0;}


0 0