半平面交。poj2451
来源:互联网 发布:网络对传播的作用 编辑:程序博客网 时间:2024/04/28 08:23
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;struct pointt{double x, y;pointt(double x, double y) :x(x), y(y){}pointt(){}};pointt operator+(pointt a, pointt b){return pointt(a.x + b.x, b.y + a.y);}pointt operator-(pointt a, pointt b){return pointt(a.x - b.x, a.y - b.y);}pointt operator*(pointt a, double t){return pointt(a.x*t, a.y*t);}double operator*(pointt a, pointt b){return a.x*b.x + a.y*b.y;}double dot(pointt a, pointt b){return a.x*b.y - a.y*b.x;}double length(pointt a){return sqrt(a*a);}struct linee{pointt p1, vec, verti;double arc;linee(pointt a, pointt b) :p1(a), vec(b - a){arc = atan2(vec.y, vec.x);double l = length(vec);verti.x = -vec.y / l; verti.y = vec.x / l;}linee(){}bool operator<(linee b){return arc < b.arc;}};bool isonleft(pointt a, linee b){pointt c = a - b.p1;return dot(c, b.vec) < 0;}pointt inter(linee a, linee b){pointt c = a.p1 - b.p1;if (fabs(dot(b.vec, a.vec)) < 1e-10)return pointt(1000000000, 1000000000);double t = dot(c, b.vec) / dot(b.vec, a.vec);return a.p1 + a.vec*t;}linee realline[20050];linee line[200550];pointt point[20050];double ans;int edgetot;void halfmat(linee *l, int n){sort(l, l + n);int first = 0; int last = 0;realline[first] = l[0];for (int i = 1; i < n; i++){while ((last - first)>0 && !isonleft(point[last - 1], l[i]))last--;while ((last - first) > 0 && !isonleft(point[first], l[i]))first++;if (fabs(dot(l[i].vec, realline[last].vec)) < 1e-10)continue;realline[++last] = l[i];if (last - first > 0)point[last - 1] = inter(realline[last], realline[last - 1]);}while ((last - first) > 0 && !isonleft(point[last - 1], realline[first]))last--;if ((last - first) > 0)point[last] = inter(realline[first], realline[last]);if ((last - first) <= 1)return;for (int i = first + 2; i <= last; i++){ans += fabs(dot(point[i] - point[first], point[i - 1] - point[first]));}ans /= 2;}int main(){int n;scanf("%d", &n);line[edgetot++] = linee(pointt(0, 0), pointt(10000, 0)); line[edgetot++] = linee(pointt(10000, 0), pointt(10000, 10000));line[edgetot++] = linee(pointt(10000, 10000), pointt(0, 10000)); line[edgetot++] = linee(pointt(0, 10000), pointt(0, 0));for (int i = 0; i < n; i++){pointt a, b;scanf("%lf%lf%lf%lf", &a.x, &a.y, &b.x, &b.y);line[edgetot++] = linee(a, b);}halfmat(line,edgetot);printf("%.1lf\n",ans);return 0;}
终于过了。。。。。23333333
阅读全文
0 0
- poj2451 半平面交
- POJ2451-半平面交
- 半平面交。poj2451
- poj2451 求半平面交模板
- 【半平面交】[POJ2451]Uyuw's Concert
- 【半平面交】[POJ2451]Uyuw's Concert
- poj2451 Uyuw's Concert【半平面交】
- [poj2451]Uyuw's Concert 半平面交
- poj2451——Uyuw's Concert//半平面交
- [POJ2451]Uyuw's Concert(半平面交)
- POJ1279/ZOJ1369 Art Gallery,POJ2451 Uyuw's Concert(半平面交求多边形的核)
- pku2451 半平面交
- 半平面交
- 半平面交
- poj2540 半平面交
- 半平面交
- 半平面交.....
- 半平面交
- HDU3068[最长回文]
- 来听听资深设计师的想法(下)
- CTF短秘钥的RSA解密
- 前言
- python_面向对象(二)
- 半平面交。poj2451
- AQS(一) 对CLH队列的增强
- yii 您提交的数据无法被验证。
- BinarySearch-----209. Minimum Size Subarray Sum
- PHP字符串操作
- 误区--变量的错误使用
- clear属性使用的小技巧
- vb.net 教程 12-3 HtmlElement类 4
- Android Binder 修炼之道(二)Client Server 实例