| ||||||||||
| 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 | |||||||||
...RE的怎么破= =/*
PROG: 旋转卡壳
LANG: C++
ID: dong_li1
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct{
int x,y;
}point;
point p[100100],q[100100];
int n,minn=0,top=0;
int dist(point p1,point p2){
return((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int multiply(point p1,point p2,point o){
return((p1.x-o.x)*(p2.y-o.y)-(p1.y-o.y)*(p2.x-o.x));
}
bool cmp(point p1,point p2){
return((multiply(p1,p2,p[minn])>0)||(multiply(p1,p2,p[minn])==0&&dist(p1,p[minn])>dist(p1,p[minn])));
}
void Graham_Scan(){
swap(p[0],p[minn]);
sort(p+1,p+n,cmp);
q[1]=p[0];q[2]=p[1];q[3]=p[2];top=3;
for(int i=3;i<n;i++){
while(multiply(q[top],p[i],q[top-1])<=0&&top>1) top--;
q[++top]=p[i];
}
}
int Get_D(){
int pos,ans;
p[n]=p[0];
for(int i=1;i<=top;i++){
while(multiply(p[i+1],p[pos+1],p[i])>multiply(p[i+1],p[pos],p[i]))
pos=(pos+1)%top;
ans=max(ans,max(dist(p[i],p[pos]),dist(p[i+1],p[pos+1])));
}
return(ans);
}
int main(){
scanf("%d\n",&n);
for(int i=0;i<n;i++){
scanf("%d %d\n",&p[i].x,&p[i].y);
if(p[i].y<q[minn].y||(p[i].y==q[minn].y&&p[i].x<q[minn].x)) minn=i;
}
if(n>2){
Graham_Scan();
printf("%d\n",Get_D());
}else
printf("%d\n",dist(p[0],p[1]));
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator