当前位置: 首页 > news >正文

【题解】[CQOI2006] 洛谷P4196 凸多边形 /【模板】半平面交

前置知识:

半平面交相关知识

建议先看看我写的半平面交笔记,这样承上启下

题面:

洛谷P4196

解析:

看上去给了很多个多边形,实际上还是一堆边,全部放到数组里排个序,直接半平面交。

相比于笔记那道题,这次的多边形是封闭的,需要踢队头,也要考虑多边形封口。

其他没啥了,直接看代码:

#include<bits/stdc++.h>
using namespace std;const int N = 1010;
const double eps = 1e-12;struct point {double x, y;
} P[N], b[N];
struct line {point s, e;
} a[N], q[N];point operator+(point a, point b) {return { a.x + b.x, a.y + b.y };
}point operator-(point a, point b) {return { a.x - b.x, a.y - b.y };
}point operator*(point a, double t) {return { a.x * t, a.y * t };
}double operator*(point a, point b) {return a.x * b.y - a.y * b.x;
}double angle(line a) {return atan2(a.e.y - a.s.y, a.e.x - a.s.x);
}bool cmp(line a, line b) {double A = angle(a), B = angle(b);if (fabs(A - B) > eps) {return A < B;} else {return ( a.e - a.s ) * (b.e - a.s) < 0;}
}point cross(line a, line b) {point u = a.s - b.s;point v = a.e - a.s;point w = b.e - b.s;double t = (u * w) / (w * v);return a.s + v * t;
}bool right(line a, line b, line c) {point p = cross(b, c);return ( a.e - a.s ) * ( p - a.s ) <= 0; 
}int n;void half_plane(){sort( a + 1, a + n + 1, cmp);int head = 1, tail = 1;q[1] = a[1];for (int i = 2; i <= n; i++) {if (angle(a[i]) - angle(a[i-1]) < eps) continue;while ( (head < tail) && right(a[i], q[tail - 1], q[tail]) ) {tail--;}while ( (head < tail) && right(a[i], q[head], q[head + 1]) ) {head++;}tail++;q[tail] = a[i];}while ( (head < tail) && right(q[tail - 1], q[tail], q[head]) ) {tail--;}tail++;q[tail] = q[head];int len = 0;for (int i = head; i < tail; i++) {len++;P[len] = cross(q[i], q[i + 1]);}double ans = 0;for (int i = 2; i < len; i++) {ans = ans + ( P[i] - P[1] ) * ( P[i + 1] - P[1] );}cout << fixed << setprecision(3) << ans / 2 << endl;
}int main() {ios::sync_with_stdio(false);cin.tie(0);int num; n = 0;cin >> num;for (int i = 1; i <= num; i++){int m;cin >> m;for (int j = 1; j <= m; j++) {cin >> b[j].x >> b[j].y;}for (int j = 1; j <= m; j++) {n++;a[n] = {b[j], b[(j % m) + 1]};}}half_plane();return 0;
}

http://www.lryc.cn/news/619594.html

相关文章:

  • 钻井泥浆搅拌机的设计cad1张三维图+设计说明书
  • 【Abp.VNext】Abp.Vnext框架模块学习
  • 服务器如何应对SYN Flood攻击?
  • 如何管理需求文档的版本历史
  • 【嵌入式电机控制#31】FOC:霍尔安装误差的补偿
  • MyBatis 中 XML 与 DAO 接口的位置关系及扫描机制详解
  • 深度学习——03 神经网络(2)-损失函数
  • Flutter网络请求实战:Retrofit+Dio完美解决方案
  • 51单片机-51单片机最小系统
  • 区块链DApp:颠覆未来的去中心化应用
  • 性能优化之通俗易懂学习requestAnimationFrame和使用场景举例
  • PyTorch生成式人工智能——基于Transformer实现文本转语音
  • 浅谈TLS 混合密钥交换:后量子迁移过渡方案
  • [TG开发]简单的回声机器人
  • 科技赋能虚拟形象:3D人脸扫描设备的应用与未来
  • vscode+phpstudy+xdebug如何调试php
  • 【R语言】R语言的工作空间映像(workspace image,通常是.RData)详解
  • YOLO v1 输出结构、预测逻辑与局限性详解
  • 教育元宇宙:一场重构教育生态的数字革命
  • 在实验室连接地下车库工控机及其数据采集设备
  • 面向局部遮挡场景的目标检测系统设计与实现
  • 开源WAF新标杆:雷池SafeLine用语义分析重构网站安全边界
  • Go语言实战案例:使用Gin处理路由参数和查询参数
  • .net\c#web、小程序、安卓开发之基于asp.net家用汽车销售管理系统的设计与实现
  • Redis学习——Redis的十大类型String、List、Hash、Set、Zset
  • SQL详细语法教程(一)--数据定义语言(DDL)
  • PCIe Base Specification解析(十)
  • 基于机器学习的自动驾驶汽车新型失效运行方法
  • BGP综合实验_Te. BGP笔记
  • Python实战教程:PDF文档自动化编辑与图表绘制全攻略