#include <algorithm> #include <iostream> #define MAXN 5000 using namespace std; int n; typedef struct Point { int x; int y; Point(int a=0,int b=0){x=a;y=b;} }Point; Point p0; Point operator -(Point a,Point b) { Point P(a.x-b.x,a.y-b.y); return P; } int operator *(Point a,Point b) { return (a.x*b.y)-(a.y*b.x); } int Direction(Point a,Point b,Point c) { return (b-a)*(c-a); } bool operator<(Point a,Point b) { return Direction(p0,a,b)>0; } int Dis(Point a,Point b) { int x=a.x-b.x; int y=a.y-b.y; return (x*x+y*y); } Point a[MAXN],b[MAXN]; int QuickSort(int p,int q) { Point r=a[q],tmp; int i,j; if (p>=q)return 0; for (i=p-1,j=p;j<=q;j++) { if (!(r<a[j])) { i++; tmp=a[i]; a[i]=a[j]; a[j]=tmp; } } QuickSort(p,i-1); QuickSort(i+1,q); return 0; } int GrahamScan() { int cnt=0,u=0; Point temp; p0=a[0]; for (int i=0;i<n;i++) { if (a[i].y<p0.y || a[i].y==p0.y && a[i].x<p0.x) { p0=a[i];u=i; } } temp=a[u];a[u]=a[0];a[0]=temp; QuickSort(1,n-1); /* printf("p0=%d,%d/n",p0.x,p0.y); for (int i=0;i<n;i++) printf("%d,%d/n",a[i].x,a[i].y);*/ if (n<=3) { memcpy(b,a,sizeof(a[0])*n); return cnt=n; } b[0]=a[0];b[1]=a[1];b[2]=a[2]; cnt=2; for (int i=3;i<n;i++) { while (!(Direction(b[cnt-1],b[cnt],a[i])>0)) {cnt--;} b[++cnt]=a[i]; } return cnt+1; } int main() { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%d",&a[i].x); scanf("%d",&a[i].y); //printf("%d,%d/n",a[i].x,a[i].y); } int sum=GrahamScan(); printf("sum=%d/n",sum); int max=0,temp; for (int i=0;i<sum-1;i++) { for (int j=1;j<sum;j++) { if (max < (temp=Dis(b[i],b[j]))) { max = temp; } } } printf("max=%d/n",max); return 0; }