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();
}
#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();
}
相关文章推荐
- 【POJ 2187】 Beauty Contest (凸包-Graham扫描算法)
- POJ-2187--Beauty Contest---凸包
- POJ Beauty Contest 2187 (凸包)
- POJ2187:Beauty Contest(凸包 & 旋转卡壳)
- 【凸包】poj 2187 Beauty Contest (旋转卡壳求平面最远点对)
- POJ 2187 Beauty Contest 构造凸包 + 旋转卡壳
- poj 2187:Beauty Contest(计算几何,求凸包,最远点对)
- POJ 2187 Beauty Contest 构造凸包 + 旋转卡壳
- POJ 2187 Beauty Contest(旋转卡壳求点凸包直径)
- POJ 2187:Beauty Contest (凸包+旋转卡壳)
- poj 2187 Beauty Contest(旋转卡壳求最远点对)
- 【POJ】2187 Beauty Contest(旋转卡壳)
- poj2187-Beauty Contest(极角排序+Graham Scan)
- poj 2187 Beauty Contest(旋转卡壳)
- poj 2187 Beauty Contest(旋转卡壳)
- poj 2187 Beauty Contest Andrew
- poj 2187 Beauty Contest Andrew
- POJ 2187 Beauty Contest(旋转卡壳)
- POJ 2187: Beauty Contest(旋转卡壳)
- Poj 2187 Beauty Contest(旋转卡壳)