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】凸多边形的更多相关文章

  1. 【BZOJ 2618】 2618: [Cqoi2006]凸多边形 (半平面交)

    2618: [Cqoi2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一 ...

  2. bzoj 2618 2618: [Cqoi2006]凸多边形(半平面交)

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 656  Solved: 340[Submit][Status] ...

  3. bzoj 2618: [Cqoi2006]凸多边形 [半平面交]

    2618: [Cqoi2006]凸多边形 半平面交 注意一开始多边形边界不要太大... #include <iostream> #include <cstdio> #inclu ...

  4. 【BZOJ2618】[CQOI2006]凸多边形(半平面交)

    [BZOJ2618][CQOI2006]凸多边形(半平面交) 题面 BZOJ 洛谷 题解 这个东西就是要求凸多边形的边所形成的半平面交. 那么就是一个半平面交模板题了. 这里写的是平方的做法. #in ...

  5. 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...

  6. 洛谷 P4196 [CQOI2006]凸多边形 (半平面交)

    题目链接:P4196 [CQOI2006]凸多边形 题意 给定 \(n\) 个凸多边形,求它们相交的面积. 思路 半平面交 半平面交的模板题. 代码 #include <bits/stdc++. ...

  7. bzoj2618: [Cqoi2006]凸多边形

    Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一行有一个整数n,表示凸多边形的个数,以下依 ...

  8. BZOJ2618[Cqoi2006]凸多边形——半平面交

    题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...

  9. LG4196 [CQOI2006]凸多边形

    题意 题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入输出格式 输入格式: 第一行有一个整数n,表示凸多边形的个数, ...

  10. P4196 [CQOI2006]凸多边形 半平面交

    \(\color{#0066ff}{题目描述}\) 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. \(\color{#0066f ...

随机推荐

  1. 图解vs2015生成JSON实例

    在开发的过程中那个会使用到JSON数据,在使用的时候需要将它反序列化进行使用 如果说JSON存在很多实例情况手动敲肯定显得很繁琐而且很容易出错,VS提供了粘贴JSON类的方法. 这是我的JSON文件 ...

  2. constructor C++ example

    The constructor for this class could be defined, as usual, as:   Rectangle::Rectangle (int x, int y) ...

  3. js求渐升数的第100位

    我弟考了道数学竞赛题,问我能不能用代码算结果.. 题目是这样的 用 1.2.3.4.5 组合数字,然后排列大小,从小到大,求排在第100位的数值大小 function foo(chars) { ; i ...

  4. 洛谷P2470 [SCOI2007]压缩(区间dp)

    题意 题目链接 Sol 神仙题Orz 考虑区间dp,如果我们只设\(f[l][r]\)表示\(s_{lr}\)被压缩的最小长度,而不去关心内部\(M\)分布的话,可能在转移的时候转移出非法状态 因此考 ...

  5. 信息检索中的TF/IDF概念与算法的解释

    https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...

  6. Android 滑动定位+吸附悬停效果实现

    在前两篇文章中,分别介绍了tablayout+scrollview 和 tablayout+recyclerview 实现的滑动定位的功能,文章链接: Android 实现锚点定位 Android t ...

  7. 基于Python实现的死链接自动化检测工具

    基于Python实现的死链接自动化检测工具   by:授客 QQ:1033553122 测试环境: win7 python 3.3.2 chardet 2.3.0 脚本作用: 检测系统中访问异常(请求 ...

  8. Android为TV端助力 自定义activity

    今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...

  9. 性能优化7--App瘦身

    1. 前言 如果你对App优化比较敏感,那么Apk安装包的大小就一定不会忽视.关于瘦身的原因,大概有以下几个方面: 对于用户来说,在功能差别不大的前提下,更小的Apk大小意味更少的流量消耗,也意味着更 ...

  10. session,cookie,sessionStorage,localStorage的区别

    浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...