poj2451Uyuw's Concert(半平面交)

链接

逆时针给出线段,如果模板是顺时针的修改下系数的符号进行平面交即可。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 20100
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 int m;
 18 int cCnt,curCnt;
 19 struct point
 20 {
 21     double x,y;
 22     point(double x=0,double y =0 ):x(x),y(y) {}
 23 };
 24 point points[N],p[N],q[N];
 25 void getline(point x,point y,double &a,double &b,double   &c)
 26 {
 27     a = x.y - y.y;
 28     b = y.x - x.x;
 29     c = x.x * y.y-y.x * x.y;
 30 }
 31 void initial()
 32 {
 33     for(int i = 1; i <= m; ++i)p[i] = points[i];
 34     p[m+1] = p[1];
 35     p[0] = p[m];
 36     cCnt = m;
 37 }
 38 point intersect(point x,point y,double a,double b,double c)
 39 {
 40     double u = fabs(a * x.x + b * x.y + c);
 41     double v = fabs(a * y.x + b * y.y + c);
 42     point pt;
 43     pt.x=(x.x * v + y.x * u) / (u + v);
 44     pt.y=(x.y * v + y.y * u) / (u + v);
 45     return  pt;
 46 }
 47 void cut(double a,double b ,double c)
 48 {
 49     curCnt = 0;
 50     for(int i = 1; i <= cCnt; ++i)
 51     {
 52         if(a*p[i].x + b*p[i].y + c >= 0)q[++curCnt] = p[i];
 53         else
 54         {
 55             if(a*p[i-1].x + b*p[i-1].y + c > 0)
 56                 q[++curCnt] = intersect(p[i],p[i-1],a,b,c);
 57             if(a*p[i+1].x + b*p[i+1].y + c > 0)
 58                 q[++curCnt] = intersect(p[i],p[i+1],a,b,c);
 59         }
 60     }
 61     for(int i = 1; i <= curCnt; ++i)p[i] = q[i];
 62     p[curCnt+1] = q[1];
 63     p[0] = p[curCnt];
 64     cCnt = curCnt;
 65 }
 66 void solve()
 67 {
 68     double area = 0;
 69     for(int i = 1; i <= cCnt; ++i)
 70         area += p[i].x * p[i + 1].y - p[i + 1].x * p[i].y;
 71     area = fabs(area / 2.0);
 72     printf("%.1f\n",area);
 73
 74 }
 75 void GuiZhengHua()
 76 {
 77     //规整化方向,逆时针变顺时针,顺时针变逆时针
 78     for(int i = 1; i < (m+1)/2; i ++)
 79         swap(points[i], points[m-i]);
 80 }
 81 int main()
 82 {
 83     points[1] = point(0,0);
 84     points[4] = point(0,10000);
 85     points[3] = point(10000,10000);
 86     points[2] = point(10000,0);
 87     points[5] = p[1];
 88     int n,i;
 89     while(scanf("%d",&n)!=EOF)
 90     {
 91         m = 4;
 92         initial();
 93         for(i = 1; i <= 4; ++i)
 94         {
 95             double a,b,c;
 96             getline(points[i],points[i+1],a,b,c);
 97             cut(a,b,c);
 98         }
 99         for(i = 1 ; i <= 2*n ; i+=2)
100         {
101             point p1,p2;
102             scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);
103             double a,b,c;
104             getline(p1,p2,a,b,c);
105             cut(a,b,c);
106         }
107
108        // m = 2*n+4;
109         //GuiZhengHua();
110         //points[m+1] = points[1];
111         solve();
112     }
113     return 0;
114 }

poj2451Uyuw's Concert(半平面交),布布扣,bubuko.com

poj2451Uyuw's Concert(半平面交)

时间: 2024-10-23 12:33:56

poj2451Uyuw's Concert(半平面交)的相关文章

poj 2451 Uyuw&#39;s Concert(半平面交)

Uyuw's Concert Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8580   Accepted: 3227 Description Prince Remmarguts solved the CHESS puzzle successfully. As an award, Uyuw planned to hold a concert in a huge piazza named after its great d

POJ2451 Uyuw&#39;s Concert (半平面交)

POJ2451  给定N个半平面 求他们的交的面积. N<=20000 首先参考 POJ1279 多边形的核 其实就是这里要求的半平面交 但是POJ1279数据较小 O(n^2)的算法 看起来是要TLE的 但是试着提交了一下 一遍就A了... 看来暴力的半平面切割法实际表现远远好于O(n^2) 如果数据再大一点呢? N=100000? 有一个办法可以优化到O(nlogn) step1. 将所有半平面按极角排序,对于极角相同的,选择性的保留一个. O(nlogn) step2. 使用一个双端队列(

半平面交总结and模板

博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40859973 这两天刷了POJ上几道半平面交,对半平面交有了初步的体会,感觉半平面交还是个挺实用的知识点. 半平面交主要是看的ZZY的国家队论文,他提出的是一种O(n×log(n))的排序增量法. 附论文地址: 算法合集之<半平面交的新算法及其实用价值>. POJ 3335 Rotating Scoreboard 题目大意: World finals 要开始了,比赛场地是一

LA 2218 (半平面交) Triathlon

题意: 有n个选手,铁人三项有连续的三段,对于每段场地选手i分别以vi, ui 和 wi匀速通过. 对于每个选手,问能否通过调整每种赛道的长度使得他成为冠军(不能并列). 分析: 粗一看,这不像一道计算几何的题目. 假设赛道总长度是1,第一段长x,第二段长y,第三段则是1-x-y 那么可以计算出每个选手完成比赛的时间Ti 对于选手i,若要成为冠军则有Ti < Tj (i ≠ j) 于是就有n-1个不等式,每个不等式都代表一个半平面. 在加上x>0, y>0, 1-x-y>0 这三个

POJ3525-Most Distant Point from the Sea(二分+半平面交)

Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3955   Accepted: 1847   Special Judge Description The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural t

bzoj 1007 水平可见直线 半平面交稀里糊涂的过了...

题意:按y=Ax+B的形式给出n(<=50000)条直线,求从y值为无穷大的地方向下看能看到的直线编号 一看到题目就想到半平面交,以每条直线的上方为一个半平面,求半平面的交,交集中存在的直线就是能看到的直线 但是写出来之后发现样例都过不了... 对于样例,如果允许半平面在边界处重叠那么答案是1,2,3,如果不允许只有1.. 然后抱着试一试的心理交上去了,结果竟然直接AC了.. 后来看题解只需要考虑交点x坐标.. bzoj 1007 水平可见直线 半平面交稀里糊涂的过了...,布布扣,bubuko

POJ 2540 半平面交求可行区域面积

Hotter Colder Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2343   Accepted: 981 Description The children's game Hotter Colder is played as follows. Player A leaves the room while player B hides an object somewhere in the room. Player

poj 3525 Most Distant Point from the Sea 半平面交 + 二分

题目来源: http://poj.org/problem?id=3525 分析: 题意:给定一个凸多边形,求多边形中距离边界最远的点到边界的距离. 思路 : 每次将凸多边形每条边往里平移d,判断是否存在核:二分d即可. 多边形边上的点(x , y)往里平移d 后的 坐标: s , e  为向量的 起点和终点, len 为起点和终点的距离, h 为平移的距离 x' = x + dx y' = y + dy dx = ( s.y - e.y ) / len * h ,( 原理 是 利用 三角形的相似

UVALive 4992 Jungle Outpost(半平面交)

题意:给你n个塔(点)形成一个顺时针的凸包,敌人可以摧毁任何塔,摧毁后剩下的塔再组成凸包 在开始的凸包内选一点为主塔,保证敌人摧毁尽量多塔时主塔都还在现在的凸包内,求出最多摧毁的塔 题解:这题关键就是选的主塔在不同的地方,敌人就会摧毁不同的塔来让你的主塔暴露 因此这样想,找出敌人摧毁不同的塔后形成的所有不同的凸包,再求出所有凸包的交就好 具体就是,首先枚举摧毁塔的个数k,再把摧毁任意k个塔所形成的所有不同的凸包求一个交,如果为空就代表了摧毁k个塔一定可以保证无论主塔在哪儿都可以暴露(关键) 而所