UVALive 6859 (凸包)
来源:互联网 发布:wine for mac下载 编辑:程序博客网 时间:2024/06/06 04:48
将每个点分成上下左右四个点加入图中,求出凸包,由于只有长度为sqrt(2.0)和1的边,所以按照横坐标差值和纵坐标差值处理即可,代码如下:
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <cmath>#include <queue>#include <map>#include <vector>using namespace std;typedef long long LL;const int maxn = 400007;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() {} P(double x, double y) : x(x), y(y) {} P operator + (P p) { return P(add(x, p.x), add(y, p.y)); } P operator - (P p) { 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_x(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* ps, int n) { sort(ps, ps+n, cmp_x); int k = 0; vector<P> qs(n*2); for(int i = 0; i < n; ++i) { while(k > 1 && (qs[k-1]- qs[k-2]).det(ps[i] - qs[k-1]) <= 0 ) k--; qs[k++] = ps[i]; } for(int i = n-2, t = k; i >= 0; --i) { while(k > t && (qs[k-1] - qs[k-2]).det(ps[i]-qs[k-1]) <= 0) k--; qs[k++] = ps[i]; } qs.resize(k-1); return qs;}double dist(P p, P q) { return (p-q).dot(p-q);}int N;P ps[maxn];void solve(int n) { vector<P> qs = convex_hull(ps, n); double res = 0.0; int kk = qs.size(); double two = sqrt(2.0); for(int i = 0; i < kk; ++i) { int t1 = abs(qs[i].x-qs[(i-1+kk)%kk].x), t2 = abs(qs[i].y-qs[(i-1+kk)%kk].y); res += abs(t1-t2); res += (double)1.0*min(t1, t2)*two; } printf("%.5lf\n", res);}int main() { int n; while(~scanf("%d", &n)) { int cnt = 0; for(int i = 0; i < n; ++i) { double x, y; scanf("%lf%lf", &x, &y); ps[cnt].x = x+1; ps[cnt++].y = y; ps[cnt].x = x; ps[cnt++].y = y+1; ps[cnt].x = x-1; ps[cnt++].y = y; ps[cnt].x = x; ps[cnt++].y = y-1; } solve(cnt); }}
0 0
- UVALive 6859 (凸包)
- UVALive 6859--凸包
- UVALive 6859 Points (凸包)
- UVAlive 6859 Points(凸包)
- UVALive 6859 Points (凸包)
- = =回归。。【UVAlive】6859凸包
- 凸包扫描 + 旋转卡壳 UVALive 4728
- UVALive 4728 (凸包 旋转卡壳)
- uvalive 6859
- UVALive 6859
- UVALive 6859
- UVALive 4986 Dome of Circus(三分、凸包、凸性函数)
- UVALive 3890 Most Distant Point from the Sea(凸包最大内接圆)
- UVALive 6859 Points
- UVALive 4670(KMP)
- UVALive 3026(KMP)
- UVALIVE 3516(DP)
- ( UVALive 7720)J
- [floyd]poj1125 Stockbroker Grapevine
- Hibernate的java.lang.StackOverFlowError问题
- 51nod 矩阵取数问题
- 考上北大有什么用?
- 在csdn中搜索自己的文章
- UVALive 6859 (凸包)
- android app 框架之BaseActivity
- Android 封装jar包,反射机制获取资源
- 解决Ubuntu下AndroidStudio中gradle process run很久的问题
- FFmpeg 参数详解(二)
- go testing
- spring注解小结
- Android开发环境搭建
- Promise