【半平面交】[POJ2451]Uyuw's Concert
来源:互联网 发布:巫妖王之怒3.35数据库 编辑:程序博客网 时间:2024/04/20 11:56
题目大意
在一个10000*10000的区域内,求半平面交的面积。
分析
半平面交模板题。
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;#define MAXN 20000#define EPS 1e-8int n,m;void Read(int &x){ char c; while(c=getchar(),c!=EOF) if(c>='0'&&c<='9'){ x=c-'0'; while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0'; ungetc(c,stdin); return; }}struct point{ double x,y; point(double x=0,double y=0):x(x),y(y){ } point operator+(const point &a)const{ return point(x+a.x,y+a.y); } point operator-(const point &a)const{ return point(x-a.x,y-a.y); } point operator*(const point &a)const{ return point(x*a.x-y*a.y,x*a.y+y*a.x); } void operator-=(const point&b){ *this=*this-b; }}poly[MAXN+10];struct Line{ point p,v; double ang; Line(){ } Line(const point &p,const point &v):p(p),v(v){ ang=atan2(v.y,v.x); } bool operator<(const Line &b)const{ return ang<b.ang; }}L[MAXN+10];double cross(point a,point b){ return a.x*b.y-a.y*b.x;}point Get_intersection(const Line &a,const Line &b){ point p=a.p-b.p; double t=cross(b.v,p)/cross(a.v,b.v); return a.p+a.v*t;}bool Onleft(const Line &a,const point &b){ return cross(a.v,b-a.p)>EPS;}Line q[MAXN+10];point p[MAXN+10];int halfplaneintersection(Line *L,point *poly){ int fr,bk,i; sort(L+1,L+n+1); q[fr=bk=0]=L[1]; for(i=2;i<=n;i++){ while(fr<bk&&!Onleft(L[i],p[bk-1])) bk--; while(fr<bk&&!Onleft(L[i],p[fr])) fr++; q[++bk]=L[i]; if(fabs(cross(q[bk-1].v,q[bk].v))<EPS){ bk--; if(Onleft(q[bk],L[i].p)) q[bk]=L[i]; } if(fr<bk) p[bk-1]=Get_intersection(q[bk],q[bk-1]); } while(fr<bk&&!Onleft(q[fr],p[bk-1])) bk--; if(bk-fr<=1) return 0; p[bk]=Get_intersection(q[fr],q[bk]); for(i=fr;i<=bk;i++) poly[++m]=p[i]; return m;}void read(){ Read(n); double x1,x2,y1,y2; for(int i=1;i<=n;i++){ scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); L[i]=Line(point(x1,y1),point(x2-x1,y2-y1)); } L[++n]=Line(point(0,10000),point(-10000,0)); L[++n]=Line(point(0,0),point(10000,0)); L[++n]=Line(point(0,0),point(0,-10000)); L[++n]=Line(point(10000,0),point(0,10000));}double ans;void print(){ int i; poly[m+1]=poly[1]; for(i=1;i<=m;i++) ans+=cross(poly[i],poly[i+1])/2; printf("%.1lf",ans);}int main(){ read(); halfplaneintersection(L,poly); print();}
0 0
- 【半平面交】[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(半平面交求多边形的核)
- POJ2451-Uyuw's Concert
- POJ2451 Uyuw's Concert
- POJ 2451 Uyuw's Concert(半平面交nlgn)
- POJ 2451 Uyuw's Concert(半平面交)
- poj 2451 Uyuw's Concert - 半平面交
- POJ 2451 Uyuw's Concert 半平面交O(nlogn)
- POJ 2451 Uyuw's Concert(半平面交求面积)
- POJ 2451 Uyuw's Concert 半平面交求面积
- poj 2451 Uyuw's Concert (半平面交)
- poj 2451:Uyuw's Concert(半平面交模板)
- POJ 2451 Uyuw's Concert (半平面交)
- Java正则、Mysql、网络编程、多线程总结
- 基变换 线性变换 矩阵
- hd 2099 整除的尾数
- 简单的IO FileWrite
- Android开发中常见的5大内存泄漏问题及解决办法
- 【半平面交】[POJ2451]Uyuw's Concert
- redis三种启动方式
- ccah-500 第7题 swap Hadoop daemon data from RAM to disk
- notepad编辑器格式化json
- Jackson常用注解介绍
- HTML5 LocalStorage 本地存储
- 1027. Colors in Mars (20)
- Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法
- google code prettify 多款主题颜色及下载