头像

Cyan

四川成都

深度强化学习炼丹师

信息学竞赛模板(十五)— 几何

信息学竞赛模板(十五)— 几何

2021-11-01 · 70次阅读 · 原创 · 数据结构与算法

1. 点线的基本结构定义

#define x first #define y second const int INF = 1e9 + 7; typedef pair<int, int> PII; //整数点 typedef pair<double, double> PDD; //实数点 //直线 struct Line { double k, b; }; //由两个点的坐标,构建一条直线 Line create(int x1, int y1, int x2, int y2) { int dy = y1 - y2, dx = x1 - x2; if (dx == 0) return {INF, x1 * 1.0}; //垂直 double k = dy * 1.0 / dx; return {k, y1 - k * x1}; }

2. 线段交点

//获取两条直线的交点 PDD get(Line &l1, Line &l2) { if (l1.k == l2.k) { //平行,无交点 return {INF, INF}; } else if (l1.k == INF) { //l1垂直 return {l1.b, l2.k * l1.b + l2.b}; } else if (l2.k == INF) { //l2垂直 return {l2.b, l1.k * l2.b + l1.b}; } //两条线都不垂直 double xx = (l2.b - l1.b) / (l1.k - l2.k); return {xx, l1.k * xx + l1.b}; }

3. 平面分割

  • 对于 n 条直线,最多能将平面分割为 1+1+2+3+...+n=n(n+1)2+11+1+2+3+...+n = \frac{n*(n+1)}{2}+1 个部分。
  • 对于前 m 条直线,已经将平面分割为 k 个部分,用一个集合保存不重复的直线。则对于新增加的一条直线,若与之前的直线有重合,则其不会对平面的分割有所贡献,直接舍去;而对于之前的所有直线都不会重合,则判断其与之前不重合直线的交点数量(统计不重合交点),则新加入的直线对平面划分的贡献为该直线与之前直线产生的不重合交点的个数+1。

标题: 信息学竞赛模板(十五)— 几何
链接: https://www.fightingok.cn/detail/138
更新: 2022-09-18 22:42:08
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可