2451 -- Uyuw's Concert

  继续半平面交,这还是简单的半平面交求面积,不过输入用cin超时了一次。

代码如下:

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <vector>
  6 #include <cmath>
  7
  8 using namespace std;
  9
 10 struct Point {
 11     double x, y;
 12     Point() {}
 13     Point(double x, double y) : x(x), y(y) {}
 14 } ;
 15 template<class T> T sqr(T x) { return x * x;}
 16 typedef Point Vec;
 17 Vec operator + (Vec a, Vec b) { return Vec(a.x + b.x, a.y + b.y);}
 18 Vec operator - (Vec a, Vec b) { return Vec(a.x - b.x, a.y - b.y);}
 19 Vec operator * (Vec a, double p) { return Vec(a.x * p, a.y * p);}
 20 Vec operator / (Vec a, double p) { return Vec(a.x / p, a.y / p);}
 21
 22 const double EPS = 1e-8;
 23 const double PI = acos(-1.0);
 24 inline int sgn(double x) { return (x > EPS) - (x < -EPS);}
 25
 26 inline double dotDet(Vec a, Vec b) { return a.x * b.x + a.y * b.y;}
 27 inline double crossDet(Vec a, Vec b) { return a.x * b.y - a.y * b.x;}
 28 inline double dotDet(Point o, Point a, Point b) { return dotDet(a - o, b - o);}
 29 inline double crossDet(Point o, Point a, Point b) { return crossDet(a - o, b - o);}
 30 inline double vecLen(Vec x) { return sqrt(dotDet(x, x));}
 31 inline double toRad(double deg) { return deg / 180.0 * PI;}
 32 inline double angle(Vec v) { return atan2(v.y, v.x);}
 33 inline Vec vecUnit(Vec x) { return x / vecLen(x);}
 34 inline Vec normal(Vec x) { return Vec(-x.y, x.x) / vecLen(x);}
 35
 36 const int N = 22222;
 37 struct DLine {
 38     Point p;
 39     Vec v;
 40     double ang;
 41     DLine() {}
 42     DLine(Point p, Vec v) : p(p), v(v) { ang = atan2(v.y, v.x);}
 43     bool operator < (DLine L) const { return ang < L.ang;}
 44 } dl[N];
 45
 46 inline bool onLeft(DLine L, Point p) { return crossDet(L.v, p - L.p) > 0;}
 47 Point dLineIntersect(DLine a, DLine b) {
 48     Vec u = a.p - b.p;
 49     double t = crossDet(b.v, u) / crossDet(a.v, b.v);
 50     return a.p + a.v * t;
 51 }
 52
 53 struct Poly {
 54     vector<Point> pt;
 55     Poly() { pt.clear();}
 56     ~Poly() {}
 57     Poly(vector<Point> &pt) : pt(pt) {}
 58     Point operator [] (int x) { return pt[x];}
 59     int size() { return pt.size();}
 60     double area() {
 61         double ret = 0.0;
 62         int sz = pt.size();
 63         pt.push_back(pt[0]);
 64         for (int i = 1; i <= sz; i++) ret += crossDet(pt[i], pt[i - 1]);
 65         pt.pop_back();
 66         return fabs(ret / 2.0);
 67     }
 68 } ;
 69
 70 Poly halfPlane(DLine *L, int n) {
 71     Poly ret = Poly();
 72     sort(L, L + n);
 73     int fi, la;
 74     Point *p = new Point[n];
 75     DLine *q = new DLine[n];
 76     q[fi = la = 0] = L[0];
 77     for (int i = 1; i < n; i++) {
 78         while (fi < la && !onLeft(L[i], p[la - 1])) la--;
 79         while (fi < la && !onLeft(L[i], p[fi])) fi++;
 80         q[++la] = L[i];
 81         if (sgn(crossDet(q[la].v, q[la - 1].v)) == 0) {
 82             la--;
 83             if (onLeft(q[la], L[i].p)) q[la] = L[i];
 84         }
 85         if (fi < la) p[la - 1] = dLineIntersect(q[la - 1], q[la]);
 86     }
 87     while (fi < la && !onLeft(q[fi], p[la - 1])) la--;
 88     if (la < fi) return ret;
 89     p[la] = dLineIntersect(q[la], q[fi]);
 90     for (int i = fi; i <= la; i++) ret.pt.push_back(p[i]);
 91     return ret;
 92 }
 93
 94 const int dir[4][2] = { {0, 0}, {1, 0}, {1, 1}, {0, 1}};
 95
 96 int main() {
 97     int T, n;
 98     while (~scanf("%d", &n)) {
 99         Point x[2];
100         for (int i = 0; i < n; i++) {
101             for (int j = 0; j < 2; j++) {
102                 scanf("%lf%lf", &x[j].x, &x[j].y);
103             }
104             dl[i] = DLine(x[0], x[1] - x[0]);
105         }
106         for (int i = 0; i < 4; i++) {
107             dl[n + i] = DLine(Point(10000.0 * dir[i][0], 10000.0 * dir[i][1]),
108                               Point(10000.0 * dir[(i + 1) & 3][0], 10000.0 * dir[(i + 1) & 3][1]) - Point(10000.0 * dir[i][0], 10000.0 * dir[i][1]));
109         }
110         Poly tmp = halfPlane(dl, n + 4);
111         printf("%.1f\n", tmp.area());
112     }
113     return 0;
114 }

View Code

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/p/poj_2451_Lyon.html

poj 2451 Uyuw's Concert (半平面交)相关推荐

  1. POJ 1474 Video Surveillance(半平面交)

    题意:半平面交求多边形内核(我明明及的我之前是会用kuangbin第一份版平面交的,现在怎么就不会用了呢,补第二份代码) 代码: #include<cstdio> #include< ...

  2. POJ - 3384 Feng Shui(半平面交)

    链接 Feng Shui 题意 将两个半径为 rrr 的圆放入一个多边形中,两个圆占据最大面积时圆心坐标是多少: 思路 在多边形中放圆,最大圆的圆心一定在多边形内核中: 将多边形的每条边都内推 rrr ...

  3. POJ 1474 Video Surveillance(半平面交)

    思路:半平面交裸题,要注意是顺时针给点. #include<iostream> #include<cstdio> #include<cstring> #includ ...

  4. (半平面交)POJ2451Uyuw‘s Concert

    POJ2451Uyuw's Concert 题意: 在一个 10000 × 10000 10000\times10000 10000×10000的正方形有 n n n条直线穿过,问左边半平面交所构成的 ...

  5. Feng Shui POJ - 3384 [半平面交]

    Feng Shui POJ - 3384 题意:n个顶点的凸包,放入2个半径为r的圆,可以重叠,要求面积最大,输出2个圆的圆心坐标(保留4位小数) 思路:找出圆心的可行域(内推r,求半平面交),再求核 ...

  6. POJ 3384 Feng Shui(半平面交)

    题意 : 给你一个凸多边形,让你在其中找两个圆,使得圆的覆盖面积最大. 这个题目和 poj 3525 有点类似,那个题目是一个圆,想到两者的联系,可以发现两个圆覆盖面积最大就是重叠面积最小,怎样使得重 ...

  7. poj 1755 Triathlon (半平面交解一元二次不等式)(切割求半平面交)

    题目链接:哆啦A梦传送门 参考链接:https://blog.csdn.net/acm_cxlove/article/details/7883370 半平面交模板 题目:铁人三项,每个人在某一项中有确 ...

  8. 半平面交练习(计算几何)

    四:半平面交 Rotating Scoreboard /*Author : lifehappy */ #include <cstdio> #include <cmath> #i ...

  9. UVA1396 Most Distant Point from the Sea(AM - ICPC - Tokyo - 2007)(计算几何,半平面交 + 二分答案)

    整理的算法模板合集: ACM模板 题目传送门 见<训练指南>P279 很明显就是一个二分答案,它问的是最远的点,直接枚举因为这里都是double类型的数所以有无限个点,我们可以直接二分. ...

最新文章

  1. uestc 1012 饭卡
  2. php mysql千万级数据修改_PHP 结合 MySQL 千万级数据处理
  3. vnx vmax分盘过程
  4. c 异常 java异常_C ++和Java中异常处理的比较
  5. java toHalf_MoreThanHalfInArray.java
  6. mongo笔记 // 一字一句的写下来,工作点滴片段
  7. 阐述:SIP协议是什么
  8. leetcode 73. 矩阵置零
  9. 前端学习(3162):react-hello-react之react插件的安装
  10. 20-mysql-事务
  11. Scala构建工具SBT
  12. javascript 数组合并与去重
  13. 电大有计算机教程吗,电大教程 计算机概述.ppt
  14. matlab热度图确定色标_MATLAB 颜色图函数(imagesc/scatter/polarPcolor/pcolor)
  15. Review Board的几点使用体会
  16. html表白网页 音乐,html表白网页源码_表白篇_网页播放无声
  17. UVa Problem 10247 Complete Tree Labeling (完全树标号)
  18. CPT203-Software Engineering
  19. 四个技巧教你解决电磁干扰问题
  20. Flask实战开发在线问答系统

热门文章

  1. Home, sweet home.
  2. diskgenius如何在Linux运行,diskgenius怎么用
  3. ubuntu shell获取IP地址、日期时间、重定向保存log,shell脚本保存管道命令执行结果
  4. 技术干货 | mPaaS 客户端问题排查:漫长的 3s 等待之谜
  5. Qt编写云台仪表盘控件
  6. 物联网大学生创新创业项目
  7. C语言学习笔记:算法
  8. Ubuntu系统连接Android真机调试
  9. 虚拟光驱 daemon tools lite 4.4 下载 2011最新版
  10. 数据中心产业怎样实现绿色环保?