您的位置:首页 > 其它

POJ 2187 Beauty Contest——凸包

2018-02-20 17:06 387 查看
因为点都是整点,所以这些点构成的凸包的顶点不会超过根号(m)个,m为坐标系的范围,因此只要构造出凸包二重循环枚举就可以了,另外当m太大时可以用旋转卡壳做,这里就不写了,以后有时间会补上

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 50005;
const double eps = 1e-10;
double add(double a, double b) {
if (abs(a+b)<eps*(abs(a)+abs(b))) return 0;
return a + b;
}
struct P {
double x, y;
P(double xx = 0.0, double yy = 0.0) : x(xx), y(yy) {}
P operator + (const P p) const {
return P(add(x, p.x), add(y, p.y));
}
P operator - (const P p) const {
return P(add(x, -p.x), add(y, -p.y));
}
P operator * (double d) {
return P(x * d, y * d);
}
double dot(P p) {
return add(x*p.x, y*p.y);
}
double det(P p) {
return add(x*p.y, -y*p.x);
}
};
bool cmp(const P &p, const P &q) {
if (p.x != q.x) return p.x < q.x;
return p.y < q.y;
}
vector<P> convex_hull(P *p, int n) {
sort(p, p+n, cmp);
int k = 0;
vector<P> q(n*2);
for (int i = 0; i < n; i++) {
while (k > 1 && (q[k-1]-q[k-2]).det(p[i]-q[k-1]) <= 0) k--;
q[k++] = p[i];
}
for (int i = n - 2, t = k; i >= 0; i--) {
while (k > t && (q[k-1]-q[k-2]).det(p[i]-q[k-1]) <= 0) k--;
q[k++] = p[i];
}
q.resize(k-1);
return q;
}
double dis(P p, P q) {
return (p-q).dot(p-q);
}
int n;
P p[maxn];
void solve() {
vector<P> q = convex_hull(p, n);
double ans = 0;
for (int i = 0; i < q.size(); i++) {
for (int j = 0; j < i; j++) {
ans = max(ans, dis(q[i], q[j]));

}
}
printf("%.0lf\n", ans);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%lf %lf", &p[i].x, &p[i].y);
}
solve();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: