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. [android] 绑定方式开启服务&调用服务的方法

    需求:后台开启一个唱歌服务,这个服务里面有个方法切换歌曲 新建一个SingService继承系统Service 重写onCreate()和onDestory()方法 填一个自定义的方法changeSi ...

  2. [android] listview入门

    Listview组件非常重要,4分之一的时间都是在搞这个,还是通过上一节的数据库,写个for循环,插入50条数据. 先使用笨方法显示数据,根布局LinearLayout 定义一个id,在activit ...

  3. Spring Security Oauth2 示例

    所有示例的依赖如下(均是SpringBoot项目) pom.xml <dependencies> <dependency> <groupId>org.springf ...

  4. 大家好,又是新的一天。今天给大家带来一些新的知识:选择器的种类和css的三种样式

    今天我们为大家 选择了 六种 选择器: 1. 标签选择器 2.id选择器 3.class选择器 4.后代选择器 5.子代选择器 6.交集选择器 我们就举三个典型的例子:后代选择器,子代选择器和交集选择 ...

  5. String的坑

       想必大家在熟悉不过了,不错今天就遇到了这个万年坑,哪怕喜欢翻源码的人,也不屑一顾翻它的源码,良言相劝最好翻下源码. 1. String为啥被定义为final ? 2. String是线程安全的么 ...

  6. idea使用svn出现问题解决办法

    idea一直在refreshing vcs history:解决办法:      有些模块中的版本信息是错的,如拷贝过来的代码,其远程仓库是不存在的,      因此要删除这些模块中的.svn文件夹 ...

  7. 移动端Html5控制布局

    <meta name="viewport" content="width=device-width, height=device-height, inital-sc ...

  8. es6 语法 (Decorator)

    修饰器是一个函数,用来修改类的行为(注意:1.函数  2.修改行为  3.对类进行操作) { //修饰器函数定义 target:类本身,name名称,descriptor描述 let readonly ...

  9. es6 语法 (symbol)

    { // 声明 let a1 = Symbol(); let a2 = Symbol(); console.log(a1 === a2); //false let a3 = Symbol.for('a ...

  10. chrome 开发者工具,查看元素 hover 样式

    在web开发中,浏览器开发者工具是我们常用的调试工具.我们经常会有这样的需求,就是查看元素的时候需要查看它的hover样式.相信有很多小伙伴都遇到过这样的情形,始终选不中hover后的元素状态.其实在 ...