杜宇飞个大坑货。。。
ppt上竟然说是2178,等我看完题了发现那是个水题才知道那个题是2187啊我擦
终于。。。。。
在经历了从今天早晨开始的14个wa之后。。。。艰难的拿到了ac。。。
其实就是很简答的旋转卡壳算法
先求一次凸包。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define MAX 50005
#define eps 1e-8
using 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;
}
。