poj2187

来源:互联网 发布:剑灵路飞捏脸数据图 编辑:程序博客网 时间:2024/06/04 18:15

杜宇飞个大坑货。。。

ppt上竟然说是2178,等我看完题了发现那是个水题才知道那个题是2187啊我擦


终于。。。。。

在经历了从今天早晨开始的14个wa之后。。。。艰难的拿到了ac。。。


其实就是很简答的旋转卡壳算法

先求一次凸包。。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#define MAX 50005#define eps 1e-8using namespace std;struct wbysr{int x,y;}a[MAX];int n,stack_num=0;wbysr stack[MAX*2];int cross(wbysr p0,wbysr p1,wbysr p2){    return(p1.x- p0.x) * (p2.y- p0.y) - (p1.y- p0.y) * (p2.x- p0.x);}int dist(wbysr a1,wbysr a2){return ((a1.x-a2.x)*(a1.x-a2.x)+(a1.y-a2.y)*(a1.y-a2.y));}int crosds(wbysr a1,wbysr a2,wbysr a3){return (a1.x-a3.x)*(a2.y-a3.y)-(a2.x-a3.x)*(a1.y-a3.y);}bool cmp(wbysr a1,wbysr a2){return (a1.x<a2.x||(a1.x==a2.x&&a1.y<a2.y));}int work(){int j=2;int ans=-1;stack[stack_num+1]=stack[1];for(int i=1;i<=stack_num;i++){while(fabs(cross(stack[i+1],stack[j+1],stack[i]))>fabs(cross(stack[i+1],stack[j],stack[i])))j=(j+1)%stack_num+1;ans=max(ans,max(dist(stack[i],stack[j]),dist(stack[i+1],stack[j+1])));}return ans;}int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){while(stack_num>1&&cross(stack[stack_num],a[i],stack[stack_num-1])<=0)stack_num--;stack[++stack_num]=a[i];}int now=stack_num;for(int i=n-1;i>=1;i--){while(stack_num>now&&cross(stack[stack_num],a[i],stack[stack_num-1])<=0)stack_num--;stack[++stack_num]=a[i];}if(n>1)stack_num--;/*for(int i=1;i<=stack_num;i++){if(a[i].x<lx){l=i;wl=a[i].x;}if(a[i].y>ly){r=i;wr=a[i].x;}}*///printf("==========================\n");printf("%d\n",work());//for(int i=1;i<=stack_num;i++)//printf("%d %d\n",stack[i].x,stack[i].y);return 0;}

0 0
原创粉丝点击