| ||||||||||
| 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 | |||||||||
Help!! get wa, why???#include<iostream>
#include<cmath>
#include<stdlib.h>
using namespace std;
#define N 50001
typedef struct
{
int x;
int y;
}point;
point points[N]; //点集
point sk[N]; //栈
int top; //栈顶指针
//计算两点之间距离平方
inline int dist(point a, point b)
{
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
//通过矢量叉积求极角关系(p0p1)(p0p2)
//d > 0 ,p0p1在p0p2顺时针方向上
inline int multi(point p0, point p1, point p2)
{
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
//排序函数
int cmp(const void *p, const void *q)
{
point a = *(point *)p;
point b = *(point *)q;
int k = multi(points[0], a, b);
if(k < 0)
return 1;
else if(k == 0 && (dist(a, points[0]) - dist(b, points[0])) > 0)
return 1;
else
return -1;
}
//互换
inline void swap(point& a, point& b)
{
point tmp = a;
a = b;
b = tmp;
}
//构造凸包
void convex_hull(int n)
{
int i, k, index = 0;
int miny = points[index].y;
for(i=1; i<n; i++) //找最左下顶点
{
if(points[i].y < miny) //找到y坐标最小的点
{
miny = points[i].y;
index = i;
}
else if(points[i].y == miny && points[i].x < points[index].x) //相同的话找到x最小的
index = i;
}
swap(points[0], points[index]);
qsort(points+1, n-1, sizeof(points[0]), cmp); //p[1:n-1]按相对p[0]的极角从小到大排序
/*
for(i=0; i<n; i++)
printf("%d %d\n", points[i].x, points[i].y);
puts("---------aa--------");
*/
sk[0] = points[0];
sk[1] = points[1];
sk[2] = points[2];
top = 2;
for(i=3; i<n; i++)
{
while(multi(sk[top-1], points[i], sk[top]) > 0)
top--;
sk[++top] = points[i];
}
}
int main()
{
//freopen("in.txt", "r", stdin);
int i, j, n;
int ans, tmp;
while(scanf("%d", &n) != EOF)
{
for(i=0; i<n; i++)
scanf("%d%d", &points[i].x, &points[i].y);
if(n == 2)
{
printf("%d\n", dist(points[0], points[1]));
continue;
}
convex_hull(n);
/*
for(i=0; i<=top; i++)
printf("%d %d\n", sk[i].x, sk[i].y);
printf("------------------------\n");
*/
ans = 0;
for(i=0; i<top; i++)
for(j=i+1; j<=top; j++)
{
tmp = dist(points[i], points[j]);
if(tmp > ans)
ans = tmp;
}
printf("%d\n", ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator