[Cqoi2006]凸多边形

Time Limit: 5 Sec Memory Limit: 128 MB

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

HINT

100%的数据满足:2<=n<=10,3<=mi<=50,每维坐标为[-1000,1000]内的整数

我会半平面交啦啦啦~~~

半平面交我不用多说,有篇论文写的太好啦! Orz

https://wenku.baidu.com/view/c750720bf78a6529647d53ae.html
(顺面可以学一波外语~嘿嘿嘿~)

我就精心画几张图来表示一下啦~~~


#include<bits/stdc++.h>
using namespace std;
struct vec{double x, y;vec() {}vec(double a, double b) { x = a, y = b; }vec operator - (const vec &A){ return vec(x - A.x, y - A.y); }
};
struct Line{vec A, B; double polar;bool operator < (const Line &A)const{ return polar < A.polar; }
}linL, lpl[505], lpd[505];
const int eps = 1e-8;
vector<Line> L;
vector<vec> ans;
int n, m, l, r;double cross(vec A, vec B){ return A.x * B.y - A.y * B.x; }
bool onleft(vec A, Line X){ return cross(X.B - X.A, A - X.A) > 0; }vec inter(Line A, Line B){double s1, s2, k; vec ret;s1 = cross((A.B - A.A), (B.B - A.A));s2 = cross((B.A - A.A), (A.B - A.A));k = s2 / (s1 + s2);ret.x = B.A.x + k * (B.B.x - B.A.x); ret.y = B.A.y + k * (B.B.y - B.A.y);return ret;
}inline void putit()
{int mx; vec p[55]; scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%d", &mx);for(int j = 1; j <= mx; ++j) scanf("%lf%lf", &p[j].x, &p[j].y);for(int j = 1; j < mx; ++j){linL.A = p[j], linL.B = p[j + 1]; linL.polar = atan2(linL.B.x - linL.A.x, linL.B.y - linL.A.y);L.push_back(linL);}linL.A = p[mx], linL.B = p[1]; linL.polar = atan2(linL.B.x - linL.A.x, linL.B.y - linL.A.y);L.push_back(linL);      }
}inline void HPI()
{sort(L.begin(), L.end());int len = L.size() - 1; int siz = 1; lpd[1] = L[0];for(int i = 1; i <= len; ++i){if(L[i].polar != lpd[siz].polar) { lpd[++siz] = L[i]; continue; }if(onleft(L[i].A, lpd[siz])) lpd[siz] = L[i];}l = 1; r = 2; lpl[1] = lpd[1], lpl[2] = lpd[2];for(int i = 3; i <= siz; ++i){while(l < r && !onleft(inter(lpl[r], lpl[r - 1]), lpd[i])) r--;while(l < r && !onleft(inter(lpl[l], lpl[l + 1]), lpd[i])) l++;lpl[++r] = lpd[i];}while(l < r && !onleft(inter(lpl[r], lpl[r - 1]), lpl[l])) r--;while(l < r && !onleft(inter(lpl[l], lpl[l + 1]), lpl[r])) l++;
}inline void print()
{lpl[r + 1] = lpl[l];for(int i = l; i <= r; ++i) ans.push_back(inter(lpl[i], lpl[i + 1]));if(ans.size() < 3) {printf("0.000"); return;}double ret = 0;     ans.push_back(ans[0]);int len = ans.size() - 1;for(int i = 0; i < len; ++i) ret += cross(ans[i], ans[i + 1]);printf("%.3lf", fabs(ret) / 2);
}int main()
{putit();HPI();print();return 0;
}

转载于:https://www.cnblogs.com/LLppdd/p/8837176.html

bzoj2618 [Cqoi2006]凸多边形相关推荐

  1. P4196 [CQOI2006]凸多边形 /【模板】半平面交

    P4196 [CQOI2006]凸多边形 /[模板]半平面交 本来是个板子题,而且我这个板子之前在POJ写过一些题目了,但是这里一直让我RE. 后来解决办法竟然是:先读入第一个多边形不加边(存下来), ...

  2. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 959  Solved: 489 [Submit][Statu ...

  3. 2618: [Cqoi2006]凸多边形

    半平面交裸题,即便如此本辣鸡还是调试了一上午- 因为是求所有图形的交,那么直接把每个图形都拆成一堆直线, 相当于每次切一刀,留下左边的,然后求最后面积 c++代码如下: #include<bit ...

  4. 模板:半平面交(计算几何)

    所谓半平面交,就是和"半平先生"当面交谈.顾名思义,这是一个源于日本的算法. (逃) 前言 感觉应用很灵活的一个算法,一切有两个变量的线性规划问题都可以转化为半平面交. 有时可能要 ...

  5. [学习笔记]半平面交

    一个直线把平面分成两部分,就是两个半平面 处理这两个平面的交的信息,就是半平面交 推荐: 计算几何之半平面交算法模板及应用 bzoj 2618 半平面交模板+学习笔记 [总结]半平面交 可以用于求任意 ...

  6. (半平面交)POJ2451Uyuw‘s Concert

    POJ2451Uyuw's Concert 题意: 在一个 10000 × 10000 10000\times10000 10000×10000的正方形有 n n n条直线穿过,问左边半平面交所构成的 ...

  7. 一句话题解(20180210~)

    2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...

  8. yxt's OI Plan

    My Plan 本篇blog只是记录一下我都咕了些啥 咕咕咕 P3246 [HNOI2016]序列 3289: Mato的文件管理 P3168 [CQOI2015]任务查询系统 P3567 [POI2 ...

  9. java n个点 凸多边形_hrbustoj 1291 点在凸多边形内

    分析:因为是凸多边形,所以只要对每条边求一下叉积即可. 设有向量P和Q则它们的叉积PXQ有以下性质: 1.PXQ>0  时,则P在Q的顺时针方向: 2.PXQ<0  时,则P在Q的逆时针方 ...

最新文章

  1. 本地navicat连接阿里云数据库
  2. 电力系统通信站和设备管理系统分析设计
  3. c# 写入xml 怪异的事情
  4. 老司机也晕车--java字符串String晕车之旅
  5. Java设计模式-桥接模式 理论代码相结合
  6. USACO Training Section 1.2 双重回文数 Dual Palindrom
  7. airpods2怎么查正品 ios11系统_拼多多AirPods2开箱评测,4种办法教你验真假,10个AirPods技巧教你玩...
  8. android gradle 设置,android gradle配置指南
  9. 腾讯打免费牌争抢市场 马化腾表示QQ旋风免费
  10. QT中QString 类的使用--获取指定字符位置、截取子字符串等
  11. 数字营销卷得再狠,「阿琉克斯之踵」不能忽视
  12. wps/word中怎么插入各种水平分隔线
  13. Dynamics CRM 365 - 零基础入门学习后端插件语法总结(样例使用方法)
  14. 搜集的育儿电子书下载大全
  15. Centos7 安装独立显卡驱动
  16. iOS音乐播放器详解(MusicPlayer1.0)
  17. 产品冷思考:大而全or小而美如何选择?
  18. 数据库 流量切分_ABTEST平行流量切分和分层流量切分高效实现及优缺点分析
  19. JSD-2204-创建csmall项目-Day02
  20. 基于SpringBoot+Mybatis的SaaS平台搭建

热门文章

  1. 2016搜狗:矩阵元素相乘
  2. 使用TaskManager爬取2万条代理IP实现自动投票功能
  3. 3 文件读写 计时 我的烂电脑在1S钟能写70多MB的数据
  4. 安装Maya 6.5指南
  5. 总结jenkins Android自动打包遇到的坑
  6. 深海中的STL—nth_element
  7. luogu 1471
  8. ueditor1.4.3jsp版成功上传图片后却回显不出来与在线管理显示不出图片的解决方案...
  9. arcgis Server Object Extension (SOE)部署jar文件失败 原因探索
  10. linux df命令参数详解