正题

题目链接:https://www.luogu.com.cn/problem/P4196


题目大意

给出nnn个凸多边形,求它们交的面积。


解题思路

就是把凸多边形上每条边作为一个半平面限制然后求一遍半平面交就好了。

具体做法是我们先将点按照级角排序,然后以此把半平面加入双端队列。

加入之前我们需要进行以下操作

  1. 如果双端队列头部两个半平面的交点不在新的半平面内,那么删去尾部的半平面
  2. 如果双端队列底部两个半平面的交点不在新的半平面内,那么删去尾部的半平面

加入完所有的半平面后我们需要连接队头和队尾,此时有可能产生新的多余平面,我们拿头部去除尾部多余,拿尾部去除头部多余即可,步骤与上面相似。

然后得出的相邻半平面两两之间的交点构成一个凸多边形,叉积求面积即可。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)(n为平面数量)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=510;
const double eps=1e-8;
int n,m,cnt;double ans;
struct point{double x,y;point(double xx=0,double yy=0){x=xx;y=yy;return;}
}p[N];
struct line{point x,y;double dir;line(point xx=0,point yy=0){x=xx;y=yy;return;}
}a[N],q[N];
int sign(double x)
{return (x>eps)-(x<-eps);}
point operator+(point x,point y)
{return point(x.x+y.x,x.y+y.y);}
point operator-(point x,point y)
{return point(x.x-y.x,x.y-y.y);}
point operator>>(point x,double k)
{return point(x.x*k,x.y*k);}
double operator^(point x,point y)
{return x.x*y.y-x.y*y.x;}
point inter(line x,line y){point s1=x.x,s2=y.x,t1=x.y-s1,t2=y.y-s2;return s2+(t2>>(((s2-s1)^t1)/(t1^t2)));
}
bool cmp(line x,line y)
{return sign(x.dir-y.dir)?(sign(x.dir-y.dir)<0):(sign((x.y-x.x)^(y.y-x.x))<0);}
bool check(line x,line y,line z){point w=inter(x,y);return sign((z.y-z.x)^(w-z.x))<0;
}
void solve(){sort(a+1,a+1+cnt,cmp);n=0;for(int i=1;i<=cnt;i++)if(sign(a[i].dir-a[i-1].dir)!=0)a[++n]=a[i];// for(int i=1;i<=n;i++)//     printf("%lf %lf %lf %lf %d\n",a[i].x.x,a[i].x.y,a[i].y.x,a[i].y.y,i);int tail=0,head=1;q[1]=a[1];q[tail=2]=a[2];for(int i=3;i<=n;i++){while(head<tail&&check(q[tail-1],q[tail],a[i]))tail--;while(head<tail&&check(q[head],q[head+1],a[i]))head++;q[++tail]=a[i];}while(head<tail&&check(q[tail-1],q[tail],q[head]))tail--;while(head<tail&&check(q[head],q[head+1],q[tail]))head++;n=0;q[++tail]=q[head];for(int i=head+1;i<=tail;i++)p[++n]=inter(q[i-1],q[i]);return;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&m);point x,last,star;for(int i=1;i<=m;i++){scanf("%lf%lf",&x.x,&x.y);if(i==1)star=x;else a[++cnt]=line(last,x);last=x;}a[++cnt]=line(x,star);}for(int i=1;i<=cnt;i++)a[i].dir=atan2(a[i].y.y-a[i].x.y,a[i].y.x-a[i].x.x);solve();p[++n]=p[1];for(int i=2;i<=n;i++)ans+=(p[i]^p[i-1]);printf("%.3lf\n",fabs(ans)/2.0);
}

P4196-[CQOI2006]凸多边形/[模板]半平面交【计算几何】相关推荐

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

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

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

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

  3. [凸多边形最大内切圆][半平面交]Most Distant Point from the Sea POJ3525

    The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is na ...

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

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

  5. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

  6. UVA1396 Most Distant Point from the Sea(AM - ICPC - Tokyo - 2007)(计算几何,半平面交 + 二分答案)

    整理的算法模板合集: ACM模板 题目传送门 见<训练指南>P279 很明显就是一个二分答案,它问的是最远的点,直接枚举因为这里都是double类型的数所以有无限个点,我们可以直接二分. ...

  7. 半平面交练习(计算几何)

    四:半平面交 Rotating Scoreboard /*Author : lifehappy */ #include <cstdio> #include <cmath> #i ...

  8. [JZOJ6093]【GDOI2019模拟2019.3.30】星辰大海【计算几何】【半平面交】

    Description 给出平面上n个点,其中1号点是可以移动的,但是移动的范围不能改变任意三个点所成的角的状态([0,π),[π,π],(π,2π][0,\pi),[\pi,\pi],(\pi,2\ ...

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

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

最新文章

  1. 关于bcache的一些事情
  2. html 鼠标focus 背景,强大的CSS:focus-visible伪类真的太6了!
  3. Hyperledger Besu企业以太坊快速教程
  4. java前端长连接框架_Java如何实现长连接
  5. element UI 制作带快捷选项的时间选择器
  6. nodejs中文件,目录的操作(1)
  7. 【朝夕技术专刊】Core3.1WebApi_Filter多种注册方式支持依赖注入
  8. c语言错误re,c语言malloc之后再realloc的有关问题
  9. Tracing mysqld Using DTrace
  10. 11.sql条件查询
  11. Linux多线程编程-线程间参数传递
  12. ffmpeg转码cpu很高,ffmpeg实现GPU(硬编码)加速转码,解决ffmpeg转码速度慢
  13. Python 音频调整音量(附代码) | Python工具
  14. 如何禁止Windows自动更新AMD显卡驱动
  15. POI生成word文档完整案例及讲解
  16. py0_二十一天计划书(前言以及本计划书)
  17. 如何规划2023高企申报?
  18. 服务器参数知多少 带你一一认识这些参数
  19. Load balancer does not have available server for client xxxx 解决办法 和
  20. 未来的全能保姆机器人作文_未来的保姆机器人650字作文

热门文章

  1. python34怎么安装_简明Python3教程 4.安装
  2. mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包
  3. python时间函数报错_Python Day11-LEGB-global-时间函数
  4. ubuntu运行python ide_在Ubuntu-16.04中安装Python可视化IDE——Spyder
  5. 终端编译opengl程序编译运行_ubuntu编译opengl和demo之二(glfw版本)
  6. jenkins java反序列化_Jenkins “Java 反序列化”过程远程命令执行漏洞
  7. java .this的用法_JAVA中this用法小结
  8. php 读取onedrive文件夹,oneindex
  9. android数据存放map_ES6 的新鲜玩意儿——集合set、map、WeekSet、WeekMap
  10. 后端学习 - Spring5