LG4196 [CQOI2006]凸多边形
题意
题目描述
逆时针给出n个凸多边形的顶点坐标,求它们交的面积。例如n=2时,两个凸多边形如下图:

则相交部分的面积为5.233。
输入输出格式
输入格式:
第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形。第i个多边形的第一行包含一个整数mi,表示多边形的边数,以下mi行每行两个整数,逆时针给出各个顶点的坐标。
输出格式:
输出文件仅包含一个实数,表示相交部分的面积,保留三位小数。
输入输出样例
说明
100%的数据满足:2<=n<=10,3<=mi<=50,每维坐标为[-1000,1000]内的整数
分析
这题数据范围这么小,直接上半平面交模板即可。
点->左闭右开区间,半平面->闭区间。
操作顺序:
- 弹双端队列
- 加入队列
- 判平行
- 求交点
最后还要用第一个半平面去除无用的平面。当last-first<=1时,半平面交是空集
时间复杂度\(O(n\log n)\)
代码
注意空集的时候面积输出0仍然要保留三位小数。
算面积的写错了仍然能AC?
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#define co const
using namespace std;
co double eps=1e-8;
int dcmp(double x) {return fabs(x)<eps?0:(x>0?1:-1);}
typedef struct Point{double x,y;}Vector;
Vector operator+(co Vector&u,co Vector&v) {return (Vector){u.x+v.x,u.y+v.y};}
Vector operator-(co Vector&u,co Vector&v) {return (Vector){u.x-v.x,u.y-v.y};}
Vector operator*(co Vector&u,double k) {return (Vector){u.x*k,u.y*k};}
double cross(co Vector&u,co Vector&v) {return u.x*v.y-u.y*v.x;}
double dot(co Vector&u,co Vector&v) {return u.x*v.x+u.y*v.y;}
struct Line{
Point p;Vector v;
double ang;
bool operator<(co Line&l) {return ang<l.ang;}
};
bool left(co Line&l,co Point&p){
return dcmp(cross(l.v,p-l.p))>0;
}
Point intersection(co Line&a,co Line&b){
return a.p+a.v*(cross(b.v,a.p-b.p)/cross(a.v,b.v));
}
int main(){
int n;scanf("%d",&n);
vector<Line>ls;
for(int m;n--;){
scanf("%d",&m);
static Point p[50];
for(int i=0;i<m;++i) scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=0;i<m;++i) ls.push_back((Line){p[i],p[(i+1)%m]-p[i]});
}
for(int i=0;i<ls.size();++i) ls[i].ang=atan2(ls[i].v.y,ls[i].v.x);
sort(ls.begin(),ls.end());
vector<Point> p(ls.size());
vector<Line> q(ls.size());
int first,last;
q[first=last=0]=ls[0];
for(int i=1;i<ls.size();++i){
while(first<last&&!left(ls[i],p[last-1])) --last;
while(first<last&&!left(ls[i],p[first])) ++first;
q[++last]=ls[i];
if(dcmp(cross(q[last].v,q[last-1].v))==0){
--last;
if(left(q[last],ls[i].p)) q[last]=ls[i];
}
if(first<last) p[last-1]=intersection(q[last-1],q[last]);
}
while(first<last&&!left(q[first],p[last-1])) --last;
if(last-first<=1) return puts("0.000"),0;
p[last]=intersection(q[last],q[first]);
vector<Point> ans;
for(int i=first;i<=last;++i) ans.push_back(p[i]);
double area=0;
for(int i=1;i<ans.size();++i) area+=cross(ans[i]-ans[0],ans[(i+1)%ans.size()]-ans[0]);
printf("%.3lf",fabs(area/2));
return 0;
}
LG4196 [CQOI2006]凸多边形的更多相关文章
- 【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] ...
- bzoj 2618: [Cqoi2006]凸多边形 [半平面交]
2618: [Cqoi2006]凸多边形 半平面交 注意一开始多边形边界不要太大... #include <iostream> #include <cstdio> #inclu ...
- 【BZOJ2618】[CQOI2006]凸多边形(半平面交)
[BZOJ2618][CQOI2006]凸多边形(半平面交) 题面 BZOJ 洛谷 题解 这个东西就是要求凸多边形的边所形成的半平面交. 那么就是一个半平面交模板题了. 这里写的是平方的做法. #in ...
- 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...
- 洛谷 P4196 [CQOI2006]凸多边形 (半平面交)
题目链接:P4196 [CQOI2006]凸多边形 题意 给定 \(n\) 个凸多边形,求它们相交的面积. 思路 半平面交 半平面交的模板题. 代码 #include <bits/stdc++. ...
- bzoj2618: [Cqoi2006]凸多边形
Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一行有一个整数n,表示凸多边形的个数,以下依 ...
- BZOJ2618[Cqoi2006]凸多边形——半平面交
题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...
- P4196 [CQOI2006]凸多边形 半平面交
\(\color{#0066ff}{题目描述}\) 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. \(\color{#0066f ...
随机推荐
- oo作业总结(一)
概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...
- 如何查看.java文件的字节码(原码)
出自于:https://www.cnblogs.com/tomasman/p/6751751.html 直接了解foreach底层有些困难,我们需要从更简单的例子着手.下面上一个简单例子: 1 pub ...
- 控制台程序读取WIKI形式的TXT文件并一表格的形式显示在Word中
'Imports System.Collections.Generic 'Imports System.Text 'Imports System.IO 'Imports office = Micros ...
- 深入理解java虚拟机---虚拟机工具jhat(十六)
jhat JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器 ...
- μC/OS-II在Microblaze上的移植与使用专题--“安富利杯”赛灵思FPGA设计技巧与应用创新博文大赛参赛作品
reference:http://xilinx.eetrend.com/d6-xilinx/blog/2010-05/682.html 随着集成电路设计与制造技术的发展,FPGA芯片的容量越来越大 ...
- DevExpress v18.1新版亮点——Data Access篇
用户界面套包DevExpress v18.1日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Data Access v18.1 的新功能,快来下载试用新版本 ...
- it网站
1:http://www.importnew.com/ importnew 专注于java的论坛 2:Github是最活跃的开源代码库和版本控制平台,可以说是程序员当中知名度最高的技术社区.各 ...
- <Scala><For beginners>
Scala Overview Scala is object-oriented Scala is a pure object-oriented language in the sense that e ...
- DeployMan,发布文件的利器
利用Delphi开发app,有时候需要发布文件,如果文件少还不是问题,但文件多的情况下,IDE带的发布功能,就显得捉襟见肘,效率低下了. 通过Project-Deployment,打开发布窗口,如下图 ...
- Day7作业及默写
1. 判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数. 例如: 153 = 1**3 + 5**3 + 3**3 InputNu ...