当前位置: 首页 > 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.dtcms.com/a/329345.html

相关文章:

  • AI时代程序员的进化:从代码工人到创意架构师-优雅草卓伊凡引言:AI浪潮下的职业重构
  • Celery在Django中的应用
  • 排序总结---保研机试极限复习
  • 亚马逊聚焦战略2.0:从资源分散到价值聚焦的商业重构逻辑
  • 北京JAVA基础面试30天打卡09
  • Java面试宝典:ZGC
  • 【自动化运维神器Ansible】playbook主机清单变量深度解析:主机变量与组变量的实战应用
  • InfluxDB数据恢复
  • 在JVM跑JavaScript脚本 | Oracle GraalJS 简介与实践
  • MySQL数据库核心操作解析
  • 数据库基础—SQL语句总结及在开发时
  • 如何使用 Ollama 在本地设置并运行 Qwen3
  • 2025年高效能工程项目管理软件推荐榜单:AI重构工程进度可视化与资源动态调度体系
  • 【国内电子数据取证厂商龙信科技】RAID存储技术
  • Spring Boot 集成 机器人指令中枢ROS2工业机械臂控制网关
  • Linux系统之K8S基本命令概述
  • PyTorch基础(Numpy与Tensor)
  • 集成 OceanBase 并打印 SQL 日志
  • 老生常谈智能指针:《More Effective C++》的条款28
  • PCIe Base Specification解析(十一)
  • nginx高性能web服务器实验
  • 【114页PPT】基于SAPSRM数字化采购解决方案(附下载方式)
  • Java面试宝典:G1垃圾收集器下
  • hadoop 前端yarn查看
  • 完整源码+技术文档!基于Hadoop+Spark的鲍鱼生理特征大数据分析系统免费分享
  • 以太坊的下一个十年:Vitalik Buterin的愿景与挑战
  • Day51--图论--99. 岛屿数量(卡码网),100. 岛屿的最大面积(卡码网)
  • 互联网大厂Java求职面试实录:Spring Boot到微服务与AI的技术问答
  • day50 图论基础 卡码网98. 所有可达路径
  • Day52--图论--101. 孤岛的总面积(卡码网),102. 沉没孤岛(卡码网),103. 水流问题(卡码网),104. 建造最大岛屿(卡码网)