P1452 Beauty Contes(旋转卡壳版)
题目背景
此处省略1W字^ ^
题目描述
贝茜在牛的选美比赛中赢得了冠军”牛世界小姐”。因此,贝西会参观N(2 < = N < = 50000)个农场来传播善意。世界将被表示成一个二维平面,每个农场位于一对整数坐标(x,y),各有一个值范围在-10000…10000。没有两个农场共享相同的一对坐标。
尽管贝西沿直线前往下一个农场,但牧场之间的距离可能很大,所以她需要一个手提箱保证在每一段旅程中她有足够吃的食物。她想确定她可能需要旅行的最大可能距离,她要知道她必须带的手提箱的大小。帮助贝西计算农场的最大距离。
输入输出格式
输入格式:
第一行:一个整数n
第2~n+1行:xi yi 表示n个农场中第i个的坐标
输出格式:
一行:最远距离的[b]平方[/b]
输入输出样例
输入样例#1:
4 0 0 0 1 1 1 1 0
输出样例#1:
2
说明
NONE
想了一下还是写写旋转卡壳吧,
毕竟做题功利性不能太强,
但是。。。。
旋转卡壳居然和暴力一样快,,,,,,,,,,,,,,,,,,,,
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #define vec point 7 using namespace std; 8 const double eps=1e-8; 9 const int MAXN=50001; 10 int n; 11 void read(int &n) 12 { 13 char c='+';int x=0;bool flag=0; 14 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} 15 while(c>='0'&&c<='9'){x=x*10+(c-48);c=getchar();} 16 flag==1?n=-x:n=x; 17 } 18 inline int dcmp(double x) 19 { 20 if(fabs(x)<eps) return 0; 21 else return x>0?1:-1; 22 } 23 struct point 24 { 25 double x,y; 26 inline point(double x=0,double y=0):x(x),y(y){}; 27 }p[MAXN],ch[MAXN]; 28 vec operator - (vec a,vec b) {return vec(a.x-b.x,a.y-b.y);} 29 vec operator + (vec a,vec b) {return vec(a.x+b.x,a.y+b.y);} 30 vec operator == (vec a,vec b){return (dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0);} 31 int comp(const point &a,const point &b) 32 { 33 if(a.x==b.x) return a.y<b.y; 34 else return a.x<b.x; 35 } 36 int stack[MAXN]; 37 double cross(vec a,vec b){return a.x*b.y-a.y*b.x;} 38 int convex_hull() 39 { 40 sort(p+1,p+n+1,comp); 41 int top=1; 42 for(int i=1;i<=n;i++) 43 { 44 while(top>2&& dcmp(cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]))<=0) top--; 45 ch[top++]=p[i]; 46 } 47 int tmp=top+1; 48 for(int i=n-1;i>=1;i--) 49 { 50 while(top+1>tmp&& dcmp(cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]))<=0) top--; 51 ch[top++]=p[i]; 52 } 53 if(n>2) top--; 54 return top; 55 } 56 int dis(point a,point b) 57 { 58 return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 59 } 60 int num=0; 61 int ans=0; 62 int Cross(point a,point b,point c) 63 { 64 return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); 65 } 66 inline void xzqk() 67 { 68 if(num==2) ans=dis(ch[1],ch[2]); 69 int j=3; 70 for(int i=1;i<=num;i++) 71 { 72 while(Cross(ch[i],ch[i+1],ch[j])<Cross(ch[i],ch[i+1],ch[j+1])) 73 j=(j+1)%num;// 防止溢出 74 ans=max(ans,max(dis(ch[i],ch[j]),dis(ch[i+1],ch[j]))); 75 } 76 } 77 int main() 78 { 79 //freopen("fc.in","r",stdin); 80 //freopen("fc.out","w",stdout); 81 read(n); 82 //ios::sync_with_stdio(0); 83 for(int i=1;i<=n;i++) 84 { 85 double a,b; 86 cin>>a>>b; 87 p[i]=point(a,b); 88 } 89 num=convex_hull(); 90 xzqk(); 91 92 printf("%d",ans); 93 return 0; 94 }
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。