| ||||||||||
| 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 | |||||||||
这样也CE 我就想不同了!#include<iostream>
#include<cmath>
#include <cstdio>
#include<algorithm>
#include <string.h>
#include <string>
using namespace std;
#define size 50008
int stack[size], cnt, n, l;
struct point
{
int x, y;
}a[size];
bool cmp(point p1, point p2)
{
int temp = (p1.x - a[0].x) * (p2.y - a[0].y) - (p2.x - a[0].x) * (p1.y - a[0].y);
if (temp == 0)
return p1.x < p2.x;
else
return temp > 0;
}
bool CrossLeft(point p1, point p2, point p3)
{
return ((p3.x - p1.x) * (p2.y - p1.y) - (p2.x - p1.x) * (p3.y - p1.y)) < 0;
}
int distance(point p1,point p2)
{
return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);
}
void Graham()
{
sort(a + 1, a + n, cmp);
cnt = 0;
stack[cnt++] = 0;
stack[cnt++] = 1;
for(int i = 2; i < n; i++)
{
while(cnt > 1 && !CrossLeft(a[stack[cnt - 2]], a[stack[cnt - 1]], a[i]))
cnt--;
stack[cnt++] = i;
}
stack[cnt] = 0;
}
int main()
{
int tx, ty, p,i;
while(scanf("%d", &n) != EOF )
{
tx = ty = 1000000;
for(i = 0; i < n; i++)
{
scanf("%d%d", &a[i].x, &a[i].y);
if (a[i].y < ty || (a[i].y == ty && a[i].x < tx))
{
tx = a[i].x, ty = a[i].y;
p = i;
}
}
point temp = a[p];
a[p] = a[0];
a[0] = temp;
Graham();
int k;
int max = -1;
stack[cnt + 1] = 1;
stack[cnt + 2] = 2;
int temp2 ,ans = -1;
for(i=0,k=1;i<cnt ;i++)
{
for(k=i+1 ;k<cnt ;k++)
{
temp2 = distance(a[stack[i]],a[stack[k]]);
if(temp2 > ans)
ans = temp2;
}
}
printf("%d\n",ans);
memset(stack,0,sizeof(stack));
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator