【CQOI2006】凸多边形
1713 -- 【CQOI2006】凸多边形
Description
逆时针给出n个凸多边形的顶点坐标,求它们交的面积。例如n=2时,两个凸多边形如下图:
则相交部分的面积为5.233。
Input
第一行有一个整数n,表示凸多边形的个数
以下依次描述各个多边形。第i个多边形的第一行包含一个整数mi,表示多边形的边数,以下mi行每行两个整数,逆时针给出各个顶点的坐标。
Output
输出仅包含一个实数,表示相交部分的面积,保留三位小数。
Sample Input
2
6
-2 0
-1 -2
1 -2
2 0
1 2
-1 2
4
0 -3
1 -1
2 2
-1 0
Sample Output
5.233
\(\\\)
半平面交的模板。
注:\(atan2\)求的是奇角(值域是\((-\pi,\pi]\))。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 200005
#define eps 1e-12
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
struct Point {
double x,y;
double angle() {return atan2(y,x);}
void out() {cout<<"("<<x<<","<<y<<") ";}
};
typedef Point Vector;
Point operator + (const Point &a,const Point &b) {return (Point) {a.x+b.x,a.y+b.y};}
Point operator - (const Point &a,const Point &b) {return (Point) {a.x-b.x,a.y-b.y};}
Point operator * (const Point &a,double b) {return (Point) {a.x*b,a.y*b};}
Point operator / (const Point &a,double b) {return (Point) {a.x/b,a.y/b};}
double Cross(const Vector &a,const Vector &b) {return a.x*b.y-a.y*b.x;}
struct Line {
Point s,t;
double ang;
void Init(Point a,Point b) {
s=a,t=b;
ang=(t-s).angle();
}
void out() {s.out(),t.out();cout<<ang;puts("");}
}l[N<<1];
int tot;
bool OnRight(const Line &a,const Point &b) {return Cross(a.t-a.s,b-a.s)<-eps;}
bool operator <(const Line &a,const Line &b) {
double x=a.ang-b.ang;
if(fabs(x)>eps) return x<0;
return OnRight(a,b.t);
}
Point intersection(const Line &a,const Line &b) {
double S=Cross(a.t-a.s,b.s-a.s),T=Cross(a.t-a.s,b.t-a.s);
return b.s+(b.t-b.s)*(S/(S-T));
}
bool is_parallel(const Line &a,const Line &b) {
return fabs(Cross(a.t-a.s,b.t-b.s))<eps;
}
int n,m;
Point p[N];
bool SI(Line *l,int n,int &m) {
static Line q[N];
static Point q2[N];
int h=0,t=0;
q[h=t=1]=l[1];
for(int i=2;i<=n;i++) {
if(fabs(l[i].ang-l[i-1].ang)<eps) continue ;
if(h<t&&(is_parallel(q[h],q[h+1])||is_parallel(q[t],q[t-1]))) {
return 0;
}
while(h<t&&OnRight(l[i],q2[t-1])) t--;
while(h<t&&OnRight(l[i],q2[h])) h++;
q[++t]=l[i];
if(h<t) q2[t-1]=intersection(q[t],q[t-1]);
}
while(h<t&&OnRight(q[h],q2[t-1])) t--;
while(h<t&&OnRight(q[t],q2[h])) h++;
if(t-h<=1) return 0;
q2[t]=intersection(q[h],q[t]);
m=t-h+1;
for(int i=1;i<=m;i++) p[i]=q2[i+h-1];
return 1;
}
double area(Point *p,int n) {
double ans=0;
for(int i=2;i<n;i++) {
ans+=Cross(p[i]-p[1],p[i+1]-p[1]);
}
return ans/2.0;
}
int main() {
int T=Get();
while(T--) {
n=Get();
for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
p[n+1]=p[1];
for(int i=1;i<=n;i++) l[++tot].Init(p[i],p[i+1]);
}
sort(l+1,l+1+tot);
if(SI(l,tot,n)) {
cout<<fixed<<setprecision(3)<<area(p,n);
} else cout<<"0.000";
return 0;
}
【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,表示凸多边形的个数,以下依次描述各个多边形.第 ...
- LG4196 [CQOI2006]凸多边形
题意 题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入输出格式 输入格式: 第一行有一个整数n,表示凸多边形的个数, ...
- P4196 [CQOI2006]凸多边形 半平面交
\(\color{#0066ff}{题目描述}\) 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. \(\color{#0066f ...
随机推荐
- [android] 绑定方式开启服务&调用服务的方法
需求:后台开启一个唱歌服务,这个服务里面有个方法切换歌曲 新建一个SingService继承系统Service 重写onCreate()和onDestory()方法 填一个自定义的方法changeSi ...
- [android] listview入门
Listview组件非常重要,4分之一的时间都是在搞这个,还是通过上一节的数据库,写个for循环,插入50条数据. 先使用笨方法显示数据,根布局LinearLayout 定义一个id,在activit ...
- Spring Security Oauth2 示例
所有示例的依赖如下(均是SpringBoot项目) pom.xml <dependencies> <dependency> <groupId>org.springf ...
- 大家好,又是新的一天。今天给大家带来一些新的知识:选择器的种类和css的三种样式
今天我们为大家 选择了 六种 选择器: 1. 标签选择器 2.id选择器 3.class选择器 4.后代选择器 5.子代选择器 6.交集选择器 我们就举三个典型的例子:后代选择器,子代选择器和交集选择 ...
- String的坑
想必大家在熟悉不过了,不错今天就遇到了这个万年坑,哪怕喜欢翻源码的人,也不屑一顾翻它的源码,良言相劝最好翻下源码. 1. String为啥被定义为final ? 2. String是线程安全的么 ...
- idea使用svn出现问题解决办法
idea一直在refreshing vcs history:解决办法: 有些模块中的版本信息是错的,如拷贝过来的代码,其远程仓库是不存在的, 因此要删除这些模块中的.svn文件夹 ...
- 移动端Html5控制布局
<meta name="viewport" content="width=device-width, height=device-height, inital-sc ...
- es6 语法 (Decorator)
修饰器是一个函数,用来修改类的行为(注意:1.函数 2.修改行为 3.对类进行操作) { //修饰器函数定义 target:类本身,name名称,descriptor描述 let readonly ...
- es6 语法 (symbol)
{ // 声明 let a1 = Symbol(); let a2 = Symbol(); console.log(a1 === a2); //false let a3 = Symbol.for('a ...
- chrome 开发者工具,查看元素 hover 样式
在web开发中,浏览器开发者工具是我们常用的调试工具.我们经常会有这样的需求,就是查看元素的时候需要查看它的hover样式.相信有很多小伙伴都遇到过这样的情形,始终选不中hover后的元素状态.其实在 ...