POJ2451Uyuw’s Concert

题意:

在一个 10000 × 10000 10000\times10000 10000×10000的正方形有 n n n条直线穿过,问左边半平面交所构成的多边形的面积是多少。

思路:

半平面交的板子题,再加上求多边形面积即可。但是依旧很些东西需要注意的。
要加上四周的直线,注意是有方向的!要保证这四条线构成的半平面交就是这个正方形。
poj提交G++的时候要用%.1f,不是%.1lf。

代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<ctype.h>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<map>
#define pii pair<int,int>
#define ll long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
#define INF 1e18
const int N=2e4+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
using namespace std;
int sgn(double x)
{if(fabs(x) < eps)return 0;if(x < 0) return -1;else return 1;
}
struct point
{double x,y;point(){}point(double xx,double yy){x=xx;y=yy;}point operator +(point b){return point(x+b.x,y+b.y);}point operator -(point b){return point(x-b.x,y-b.y);}double operator ^(point b){return x*b.y-y*b.x;}//叉乘 double operator *(point b){return x*b.x+y*b.y;}//点乘 point operator *(double b){return point(x*b,y*b);}//数乘   void read(){scanf("%lf%lf",&x,&y);}
};
struct line
{point s,e,l;line(){}line(point ss,point ee){s = ss;e = ee;l=e-s;}void read(){s.read(),e.read();l=e-s;}double gettan(){return atan2(e.y-s.y,e.x-s.x);}
};
line li[N],que[N];
//找直线交点
point getcross(line l1,line l2)
{double s1=((l2.s-l1.s)^(l2.e-l1.s));double s2=((l2.e-l1.e)^(l2.s-l1.e));if(s1+s2==0)//平行 return point{inf,inf};return l1.s+l1.l*(s1/(s1+s2));
}
//多边形面积
double askarea(point d[],int n)
{d[n+1]=d[1];double area=0;for(int i=1;i<=n;i++)area+=(d[i]^d[i+1]);area/=2;return fabs(area);
}
int cmp(line a,line b)
{double t1=a.gettan(),t2=b.gettan();if(sgn(t1-t2)==0)return (a.l^(b.e-a.s))>0;return t1<t2;
}
//判断bc交点是否在a的右边,如果在,去掉头部或者尾部的线
int onright(line a,line b,line c)
{point p=getcross(b,c);return (a.l^(p-a.s))<0;
}
//半平面交
double hpi(int n)
{sort(li+1,li+n+1,cmp);int l=1,r=1,cnt=0,i;//模拟deque//去重,极角相同取左边,即保留最后直线 for(i=1;i<n;i++)if(sgn(li[i].gettan()-li[i+1].gettan()))li[++cnt]=li[i];li[++cnt]=li[n];//判断新加入线的影响 for(i=1;i<=cnt;i++){while(r-l>1 && onright(li[i],que[r-1],que[r-2]))r--;while(r-l>1 && onright(li[i],que[l],que[l+1]))l++;que[r++]=li[i]; }//判断最先和最后加入的直线的影响while(r-l>1 && onright(que[l],que[r-1],que[r-2]))r--;while(r-l>1 && onright(que[r-1],que[l],que[l+1]))l++;int len=0;point p[N];for(i=l;i<r-1;i++)p[++len]=getcross(que[i],que[i+1]);p[++len]=getcross(que[r-1],que[l]);if(len<3)return 0;elsereturn askarea(p,len);
} int main()
{int i,n;scanf("%d",&n);for(i=1;i<=n;i++)li[i].read();li[n+1]=line(point(0,0),point(10000,0));li[n+2]=line(point(0,10000),point(0,0));li[n+3]=line(point(10000,0),point(10000,10000));li[n+4]=line(point(10000,10000),point(0,10000));double ans=hpi(n+4);printf("%.1f\n",ans);return 0;
}

相似题目:洛谷P4196P4196 [CQOI2006]凸多边形 /【模板】半平面交

(半平面交)POJ2451Uyuw‘s Concert相关推荐

  1. poj 2451 Uyuw's Concert (半平面交)

    2451 -- Uyuw's Concert 继续半平面交,这还是简单的半平面交求面积,不过输入用cin超时了一次. 代码如下: 1 #include <cstdio> 2 #includ ...

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

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

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

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

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

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

  5. LA 2218 (半平面交) Triathlon

    题意: 有n个选手,铁人三项有连续的三段,对于每段场地选手i分别以vi, ui 和 wi匀速通过. 对于每个选手,问能否通过调整每种赛道的长度使得他成为冠军(不能并列). 分析: 粗一看,这不像一道计 ...

  6. POJ3335(半平面交)

    POJ3335 半平面交裸题 //poj3335 #include <cstdio> #include <cmath> #include <algorithm> # ...

  7. LA 3890 (半平面交) Most Distant Point from the Sea

    题意: 给出一个凸n边形,求多边形内部一点使得该点到边的最小距离最大. 分析: 最小值最大可以用二分. 多边形每条边的左边是一个半平面,将这n个半平面向左移动距离x,则将这个凸多边形缩小了.如果这n个 ...

  8. [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)

    Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.     例如,对于直线:   ...

  9. 模板:半平面交(计算几何)

    所谓半平面交,就是和"半平先生"当面交谈.顾名思义,这是一个源于日本的算法. (逃) 前言 感觉应用很灵活的一个算法,一切有两个变量的线性规划问题都可以转化为半平面交. 有时可能要 ...

最新文章

  1. oracle is删除表数据库,rman删除expired备份提示“This command is forbidden”
  2. VirtualProtect VirtualLock VirtualUnlock
  3. 【ArcGIS风暴】ArcGIS Editor for OSM中文教程(2):下载及加载OSM数据
  4. python在线编辑器import_maya_关于脚本编辑器导入python模块
  5. python图像处理模糊_Python+OpenCV图像处理之模糊操作
  6. 最简单的基于FFmpeg的AVfilter的例子-纯净版
  7. Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别
  8. 特洛伊木马程序_为什么物联网设备是我们这个时代的特洛伊木马?为什么没人谈论它?...
  9. Win10 PowerToys官方免费效率小工具集
  10. 百度指数、淘宝指数学习笔记
  11. 简述计算机数控系统的工作原理,计算机数控系统与802D系统编程基本原理
  12. 我是高管,空降的第60天,被辞职了,惨惨惨
  13. CyanogenMod ROM 首次官方兼容小米
  14. 计算机网络发展的第四阶段特点,计算机网络基础考试重点.doc
  15. 关于二级域名与三级域名的解释
  16. 华为手机刷微博体验更好?技术角度的分析和思考,Android基础72问
  17. 单元节点和积分点有什么区别
  18. 单片微型计算机系统应用和开发特点,单片微机原理及应用--徐春辉---电子工业出版社习题答案.doc...
  19. EventListener
  20. Inventory 物料库存 mtl_transactions_interface 开发[转]

热门文章

  1. 基于Python的工人员工工资管理系统
  2. 监督学习和无监督学习(概念)
  3. 翻译连载 | JavaScript轻量级函数式编程-第4章:组合函数 |《你不知道的JS》姊妹篇
  4. 项目进度推进——工作成果呈现
  5. 如何利用Framework模型生成IQD文件
  6. textarea去除红色波浪线
  7. 编写测试用例方法----因果图判定表
  8. Vue面包屑导航实现方案
  9. 菜鸟haqima的第一天(c++)篇
  10. Exercise 35: 分支和函数