CodeChef submission 617231 (C) plaintext list. Status: WA, problem E3, contest . By karlheinz_jung (karlheinz_jung), 2011-08-05 16:30:56.
#include <stdio.h> #include <stdlib.h> #include <math.h> #define Q(a,b,c) (abs((b->x-a->x)*(c->y-a->y)-(c->x-a->x)*(b->y-a->y))) #define S(a) (Us[a]->x-Us[m-1]->x)*(Us[a]->x-Us[m-1]->x)+(Us[a]->y-Us[m-1]->y)*(Us[a]->y-Us[m-1]->y) #define T(a,b,c) ((b->x-a->x)*(c->y-a->y)-(b->y-a->y)*(c->x-a->x)) typedef struct { int x, y, z; double o; } U; U p[1000100], *q[1000100]; int A(U **p1, U **p2) { if((*p1)->z||(*p2)->z) return(*p2)->z-(*p1)->z; if((*p1)->o>(*p2)->o) return -1; if((*p1)->o<(*p2)->o) return 1; return 0; } int B(int n, U **Us) { int m, i=1, x, y, h; for(;i<n; i++) { x=Us[i]->x-Us[0]->x; if(!(y=Us[i]->y-Us[0]->y)) Us[i]->z=x; else { Us[i]->z=0; Us[i]->o=(double)x/y; } } qsort(Us+1,n-1,sizeof(U *),(int(*)(const void *, const void *))A); if(n<3)return n; for(i=(m=1)+1; i<n; i++) { for(;(h=T(Us[m-1],Us[m],Us[i]))<=0&&m>1; m--); if(!h&&S(m)<S(i)) Us[m]=Us[i]; else Us[++m]=Us[i]; } return m+1-(T(Us[m-1],Us[m],Us[0])<=0&&m>1); } void C(int n, U **p) { int i=0, j, m=B(n,p), x=0, y, z, k, am; U *a, *b; for(;i<=m-3; i++) for(y=(j=i+1)+1,a=p[i]; j<=m-2; y=m-(k==m),x=(z>x)?z:x,j++) for(k=y+(z=0),b=p[j]; k<=m-1; z=am,k++) if((am=Q(a,b,p[k]))<=z) { y=k-1; break; } } main() { int fall, n, j, w; U tmp, v; { tmp=v; p[w]=p[0]; p[0]=tmp; if(n<3) puts("0"); else C(n,q); } return 0; }
Comments

