| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
为什么wa。。大牛们帮小弟看一下。。。谢了#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=50005;
struct point{
int x,y;
}P[maxn];
int multi(point a,point b,point c){
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
int dist(point a,point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int cmp(const void*a,const void *b){
point *c=(point*)a;
point *d=(point*)b;
int t=multi((*c),(*d),P[0]);
if(t<=0)return 1;
else if(t==0&&dist(*c,P[0])>dist(*d,P[0]))return 1;
else return -1;
}
int roating_calipers(point que[],int N){
int q=1,ret=0;
que[N]=que[0];
for(int i=0;i<N;++i){
while(multi(que[(i+1)%N],que[(q+1)%N],que[i])>multi(que[(i+1)%N],que[q],que[i])) q=(q+1)%N;
ret=max(ret,max(dist(que[i],que[q]),dist(que[(i+1)%N],que[(q+1)%N])));
}
return ret;
}
int Graham(point que[],int &len,int n){
int mini=0;
for(int i=1;i<n;++i){
if(P[i].y<P[mini].y||(P[i].y==P[mini].y&&P[i].x<P[mini].x)) mini=i;
}
if(mini!=0) swap(P[mini],P[0]);
qsort(P,n,sizeof(P[0]),cmp);
que[0]=P[0];
que[1]=P[1];
que[2]=P[2];
int top=2;
for(int i=3;i<n;++i){
while(top>0&&multi(que[top],P[i],que[top-1])<0) top--;
que[++top]=P[i];
}
len=top+1;
int s=roating_calipers(que,len);
return s;
}
int main(){
// freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;++i){
scanf("%d %d",&P[i].x,&P[i].y);
}
if(n==2) printf("%d\n",dist(P[0],P[1]));
else{
point que[maxn];
int len;
int R=Graham(que,len,n);
printf("%d\n",R);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator