bzoj2618: [Cqoi2006]凸多边形
Description
则相交部分的面积为5.233。
Input
第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形。第i个多边形的第一行包含一个整数mi,表示多边形的边数,以下mi行每行两个整数,逆时针给出各个顶点的坐标。
Output
输出文件仅包含一个实数,表示相交部分的面积,保留三位小数。
凸多边形交转为半平面交
#include<cstdio>
#include<cmath>
#include<algorithm>
const double pi=acos(-),_0=1e-;
struct vec{double x,y;};
struct line{vec p,v;double a;
void cal(){
if(v.y==&&v.x<)a=pi;
else a=atan2(v.y,v.x);
}
};
vec operator+(vec a,vec b){return (vec){a.x+b.x,a.y+b.y};}
vec operator-(vec a,vec b){return (vec){a.x-b.x,a.y-b.y};}
vec operator*(vec a,double b){return (vec){a.x*b,a.y*b};}
double operator*(vec a,vec b){return a.x*b.y-b.x*a.y;}
bool operator<(line a,line b){return a.a<b.a;}
vec operator&(line a,line b){return a.p+a.v*((b.v*(a.p-b.p))/(a.v*b.v));}
bool chk(line a,vec b){return a.v*(b-a.p)>;}
double ans=;
int n,m;
line ls[],q[];
vec ps[];
int l=,r=,p=;
int main(){
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&m);
for(int i=;i<m;i++){
scanf("%lf%lf",&ps[i].x,&ps[i].y);
}
ps[m]=ps[];
for(int i=;i<m;i++){
ls[p].p=ps[i];
ls[p].v=ps[i+]-ps[i];
ls[p].cal();
p++;
}
}
std::sort(ls,ls+p);
q[]=ls[];
for(int i=;i<p;i++){
while(l<r&&!chk(ls[i],q[r-]&q[r]))--r;
while(l<r&&!chk(ls[i],q[l]&q[l+]))++l;
q[++r]=ls[i];
if(fabs(q[r].v*q[r-].v)<_0){
--r;
if(chk(q[r],ls[i].p))q[r]=ls[i];
}
}
while(l<r&&!chk(q[l],q[r-]&q[r]))--r;
if(r-l<=){
puts("0.000");
return ;
}
for(int i=l;i<r;i++)ps[i]=(q[i]&q[i+]);
ps[r]=(q[r]&q[l]);
for(int i=l+;i<r;i++)ans+=fabs((ps[i]-ps[l])*(ps[i+]-ps[l]))*.;
printf("%.3lf\n",ans);
return ;
}
bzoj2618: [Cqoi2006]凸多边形的更多相关文章
- BZOJ2618[Cqoi2006]凸多边形——半平面交
题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...
- BZOJ2618 [Cqoi2006]凸多边形 凸包 计算几何
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2618 题意概括 给出多个凸包,求面积交. 题解 首先我们考虑两个凸包相交的情况. 例题:HDU16 ...
- 【半平面交】bzoj2618 [Cqoi2006]凸多边形
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- bzoj2618[Cqoi2006]凸多边形 半平面交
这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...
- BZOJ-2618 [CQOI2006]凸多边形
半平面交模版题.. #include <cstdlib> #include <cstdio> #include <cmath> #include <cstri ...
- 【BZOJ2618】[CQOI2006]凸多边形(半平面交)
[BZOJ2618][CQOI2006]凸多边形(半平面交) 题面 BZOJ 洛谷 题解 这个东西就是要求凸多边形的边所形成的半平面交. 那么就是一个半平面交模板题了. 这里写的是平方的做法. #in ...
- 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 959 Solved: 489[Submit][Status] ...
- 【BZOJ 2618】 2618: [Cqoi2006]凸多边形 (半平面交)
2618: [Cqoi2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一 ...
- bzoj 2618 2618: [Cqoi2006]凸多边形(半平面交)
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 656 Solved: 340[Submit][Status] ...
随机推荐
- 使用AjaxPro
1:后台注册 protected void Page_Load(object sender, EventArgs e) { AjaxPro.Utility.RegisterTypeForAjax(ty ...
- 310. Minimum Height Trees
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- indexOf()的用法
indexOf()的用法:返回字符中indexof(string)中字串string在父串中首次出现的位置,从0开始!没有返回-1:方便判断和截取字符串! indexOf()定义和用法indexOf( ...
- URIEncoding和useBodyEncodingForURI详解
之前关于编码的问题已经总结过两次了,有些地方写的很粗略.http://blog.itpub.net/29254281/viewspace-775925/http://blog.itpub.net/29 ...
- vsftpd搭建及配置参数
一.FTP简介 FTP:File Transger Protocol(文件传输协议) 文件共享服务:工作在应用层 NFS:Network File System(RPC:Remote Procedur ...
- 记事本写JAVA程序
编写程序源码: 1.新建记事本程序,修改文件名称为HelloWorld.java 打开编辑以下内容,保存. public class HelloWorld { public static void m ...
- UVA11324 强连通+dp记忆化搜索
题意:对于一个有向图,问最大团中有多少点,要求该点集内所有点对间至少有一条路径(u到v或v到u或两条都有). 首先,对于每一个强连通分量,其中的所有点必然能够互相到达,所以先进行缩点,然后对于缩点后的 ...
- kuangbin_ShortPath H (POJ 3660)
本来想自己写个bfs让他顺着胜负边爬 走到拐弯处就判定无法确定次序 然后我发现有多余的边并不会自己省略掉 要写个O(n^3)的删掉多余边这都不如Floyd了 看奚政学长写的是拓扑序也能解 然后在理解看 ...
- Fragment 和 FragmentActivity的使用
Fragment 和 FragmentActivity的使用 http://blog.csdn.net/izy0001989624/article/details/17072211
- MAVEN build ,GOAL plugin ,execution
http://www.avajava.com/tutorials/lessons/what-are-the-phases-of-the-maven-clean-lifecycle.html https ...