
计算几何
f_zyj
一个追逐蝴蝶的人!
展开
-
Graham求凸包
ACM模版Graham/* * Graham 求凸包 O(N * logN) * CALL: nr = graham(pnt, int n, res); res[]为凸包点集; */struct point{ double x, y;};bool mult(point sp, point ep, point op){ return (sp.x - op.x) *原创 2016-07-23 15:50:33 · 1827 阅读 · 0 评论 -
HDU-1007-Quoit Design
ACM模版描述题解平面最近点对问题,模版题……反正本渣渣是直接套模版的,复杂度O(nlogn)。等白天了好好看看算导,这个算法怎么搞的~~~代码#include <iostream>#include <cmath>#include <cstdio>/* * O(N * logN) */const int MAXN = 100005;const double EPS = 0.00001;原创 2016-10-16 02:06:46 · 389 阅读 · 0 评论 -
HDU-2050-折线分割平面
ACM模版描述题解递推,找规律,规律随便懵的,没成想对了……为了方便我们描述,我们把第i条折线的两段分别表示未Li1,Li2。首先,当n等于0时,平面是一个部分,当n等于1时,先来考虑L11,这时候平面没有线段,那么他能贯穿的线段为0,所以添加这条线可以增加一个部分,然后考虑L12,此时除去L11外,他可以贯穿的线段为0,所以添加这条线段可以增加零个部分,为什么前者可以增加的比后者多一呢?这是因为两原创 2016-11-24 23:29:01 · 529 阅读 · 0 评论 -
HRBUST-1025-JiaoZhu and WAR3
ACM模版描述题解很简单的一道题,直接放大离散化,将主城和塔的所有属性均扩大一千倍,然后均匀取10000个点进行判断是否覆盖,其实也就是离散化的思维吧。代码#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int MAXN = 55;const int MAXM = 10000;struc原创 2017-02-23 21:19:12 · 523 阅读 · 0 评论 -
EOJ-大学生程序设计邀请赛(华东师范大学)-I-七巧板
ACM模版描述 题解计算几何问题……不难,就是麻烦,精度问题也需要着重注意,注意人家输入精确到 10−1210^{-12},而不是拼接时精确到 10−1210^{-12}!我是通过判断面积是否可以构成正方形(与最大边符合),三角形是否有五个,四边形是否有两个,七个多边形一共23条边排序后是否符合七巧板的规格等等,当然,我这个也不是最简单的,完全可以通过判断多边形之间各边关系来判定是否可行,具体的需原创 2017-05-15 17:58:26 · 899 阅读 · 0 评论 -
CF-Tinkoff Challenge-Elimination Round-C-Mice problem
ACM模版描述 题解当时做这个题没有完全看清楚题,strictly,严格的,严格处于捕鼠器中,所以只出现在边上是不对的。这里我们可以在线处理,一边读入,一边缩小时间区间,最后输出时间左区间即可,也就是最少时间,如果中间就能判断输出-1,那就输出-1结束吧。这里我们需要注意一个问题,既然严格在捕鼠器内,那么最后的时间区间一定是刚好有鼠在边界上的,那么我们为什么输出左区间就可以了呢?这是因为这个题是存原创 2017-04-27 22:44:10 · 514 阅读 · 0 评论 -
蓝桥-ALGO-25-Car的旅行路线
ACM模版描述题解说起蓝桥杯,虽然现在搞得越来越大了,可是一点不走心,官网的 OJ 做得垃圾透了,好好一个题给的样例都是错的,真是扯啊~~~这个题其实就是一个建图+Floyd,建图比较麻烦一点,其中比较核心的是已知三点求矩形第四点,这个我用的是先求出三角形的直角顶点,然后根据一个公式 x4=x2+x3−x1,y4=y2+y3−y1x4 = x2 + x3 - x1, y4 = y2 + y3 - y原创 2017-06-04 17:42:40 · 4089 阅读 · 1 评论 -
Liuctic计算几何库
ACM模版Liuctic计算几何库/* * Liuctic 的计算几何库 * p-Lpoint ln,l - Lline ls - Llineseglr - Lrad * 求平面上两点之间的距离 p2pdis * 返回(P1-P0)*(P2-P0)的叉积 xmulti * 确定两条线段是否相交 lsinterls *原创 2016-07-23 21:46:31 · 2671 阅读 · 0 评论 -
蓝桥-BASIC-18-矩形面积交
ACM模版描述题解这个问题本身不难,不过让我充盈了 Liuctic 计算几何库,这个库我也不知道最开始是谁整理的,看着挺好的,就加进了我的计算几何模板中……这个问题的解法很多种,我使用的就是一个公式,也是我加进库里的这个,把四个点的横纵坐标分别从小到大排序,然后相交的面积即为 (x3−x2)∗(y3−y2)(x3 - x2) * (y3 - y2)。其他方法就不多说了,毕竟方法多种多样,说起来实在累原创 2017-06-01 15:35:13 · 523 阅读 · 0 评论 -
计蒜客-2017 计蒜之道 复赛-B-Windows 画图
ACM模版描述 题解平面几何问题,遍历所有线段,不断更新坐标的状态即可。水题~~~代码#include <iostream>#include <cstdio>using namespace std;const int MAXM = 255;int n, m, q;int map[MAXM][MAXM];struct node{ int x, y;} A, B;int main(in原创 2017-06-11 22:31:36 · 440 阅读 · 0 评论 -
51Nod-1451-合法三角形
ACM模版描述题解用 C(n,3)−repC(n, 3) - rep,先求出任意边的斜率,然后判重,重复的部分进行删除即可,也就是 rep 部分。思路不难,就是需要注意两点,long long 和 double,小心溢出和精度不够的问题哦!代码#include <iostream>#include <algorithm>#include <cmath>using namespace std;ty原创 2017-06-25 21:35:03 · 598 阅读 · 0 评论 -
HDU-2017中国大学生程序设计竞赛-网络选拔赛-1005-CaoHaha's staff
ACM模版描述题解预处理出来所有情况下最大能够构成的面积,然后二分即可。代码#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int MAXN = 1e5 + 10;double n;double ans[MAXN];void init(){原创 2017-08-20 18:02:27 · 714 阅读 · 0 评论 -
HDU-2017 多校训练赛2-1011-Regular polygon
ACM模版描述题解都怪我英语不好,更怪百度翻译个信球,硬生生将正方形给我翻译成了正多边形,导致一上来我就写了一个 搜索 + 凸包 + 判边……后来才发现,我读错题了!!!这个题需要用到二维平面 HASHHASH 解决,之所以要用到 HASHHASH 是因为我们只需要枚举两个点构成的一条边就能获取另外一条对边,所以呢,我们要判断这条对边的两个顶点是否存在,如果存在说明存在,最后注意除以 44,因为正方原创 2017-07-28 18:29:35 · 465 阅读 · 2 评论 -
HDU-2017 多校训练赛6-1002-Mindis
ACM模版描述题解这个题官方题解是用反演搞的,但是我不是特别会,看到我 佐学姐 用 平面几何 + 代数方法 解的这个题感觉十分巧妙,也更加容易理解一些。佐理慧’s blog,虽然学姐写的十分详细,但是我依然因为高中的数学知识都不知道丢哪儿了而看了好一会儿,数学这东西,说忘就忘啊。利用椭圆逼近获取最近距离即可。代码#include <algorithm>#include <cstring>#inc原创 2017-08-21 17:40:50 · 630 阅读 · 1 评论 -
HDU-2017 ACM/ICPC Asia Regional Qingdao Online-1001-Apple
ACM模版描述题解平面几何 + 大浮点数……很恶心啊……用 javajava 写会容易些。给定三个点,然后判断第四点是否在这三个点的外接圆内。代码import java.math.BigDecimal;import java.util.Scanner;class Util { public static BigDecimal calR(Dot a, Dot b) { ret原创 2017-09-18 13:21:39 · 653 阅读 · 0 评论 -
HDU-1558-Segment set
ACM模版描述题解计算几何+并查集。神奇的组合……代码#include <iostream>const double eps = 1e-10;const int MAXN = 1010;struct point{ double x, y;};struct edge{ point a; point b;};int pre[MAXN];int res[MAXN];s原创 2016-11-04 01:58:40 · 466 阅读 · 0 评论 -
51Nod-1319-跳跃游戏
ACM模版描述题解计算几何问题,这里的考点是三角形周长和边长的关系。众所周知,三角形周长大于任意一条边的两倍,那么只要大于最长的一条边长,那么一定可以构成三角形。接着,我们来分析在什么时候需要考虑是否可以三角形问题。 看到这个问题,步数是循环数组A的,所以,A数组循环情况可以分为以下三种: 1、不到一循环; 2、一循环开外,不到两循环; 3、两循环开外。第一种,不到一循环,比如说x步(x <原创 2016-09-06 16:22:58 · 674 阅读 · 0 评论 -
51Nod-1100-斜率最大
ACM模版描述题解因为斜率最大的两点一定是x轴坐标相邻的两点。 所以,先进行排序,将斜率最大的线存起来,最后对线进行按x轴坐标排序,正序输出对应编号即可。代码#include <iostream>#include <algorithm>#include <cstdio>using namespace std;const int MAXN = 1e4 + 10;struct point{原创 2016-08-07 02:46:02 · 648 阅读 · 0 评论 -
求多边形重心
ACM模版求多边形重心/* * 求多边形重心 * INIT: pnt[]已按顺时针(或逆时针)排好序; | CALL: res = bcenter(pnt, n); */struct point{ double x, y;};point bcenter(point pnt[], int n){ point p, s; double tp, area = 0,原创 2016-07-23 16:56:23 · 1415 阅读 · 0 评论 -
平面最近点对
ACM模版平面最近点对/* * O(N * logN) */const int N = 100005;const double MAX = 10e100, eps = 0.00001;struct Point{ double x, y; int index;};Point a[N], b[N], c[N];double closest(Point *, Point *,原创 2016-07-23 20:03:29 · 1227 阅读 · 0 评论 -
旋转卡壳
ACM模版求解平面最远点对参考题目链接: POJ 2187 Beauty Conteststruct Point{ int x, y; Point(int _x = 0, int _y = 0) { x = _x; y = _y; } Point operator - (const Point &b)const {原创 2016-07-25 16:13:46 · 1286 阅读 · 0 评论 -
半平面交
ACM模版半平面交模版const double eps = 1e-8;const double PI = acos(-1.0);int sgn(double x){ if (fabs(x) < eps) { return 0; } if (x < 0) { return -1; } else {原创 2016-07-25 16:46:22 · 1400 阅读 · 0 评论 -
三角形相关重点
ACM模版三角形重点设三角形的三条边为a, b, c, 且不妨假设a <= b <= c.面积三角形面积可以根据海伦公式求得: s = sqrt(p * (p - a) * (p - b) * (p - c)); p = (a + b + c) / 2;关键点与A, B, C三顶点距离之和费马点该点到三角形三个顶点的距离之和最小。 有个有趣的结论: 若三角形的三个内角均小于120度原创 2016-07-23 17:46:25 · 1454 阅读 · 4 评论 -
51Nod-1264-线段相交
ACM模版描述给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出”Yes”,否则输出”No”。Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4。(-10^8 <= xi, yi <= 10^8) (直线1的两个端点为x1,y原创 2016-07-29 01:37:54 · 640 阅读 · 0 评论 -
判断线段相交
ACM模版判断线段相交const double eps=1e-10;struct point{ double x, y;};double min(double a, double b){ return a < b ? a : b;}double max(double a, double b){ return a > b ? a : b;}bool inter(po原创 2016-07-23 16:11:27 · 1437 阅读 · 0 评论 -
判断四点共面
ACM模版混合积struct point{ double x, y, z; point operator - (point &o) { point ans; ans.x = this->x - o.x; ans.y = this->y - o.y; ans.z = this->z - o.z;原创 2016-07-29 03:30:24 · 3636 阅读 · 6 评论 -
51Nod-1265-四点共面
ACM模版描述给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出”Yes”,否则输出”No”。Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。Outp原创 2016-07-29 03:28:07 · 1431 阅读 · 0 评论 -
判断线段与圆是否相交
ACM模版判断线段与圆是否相交typedef long long ll;typedef struct // 点结构{ ll x, y;} Point;Point A, B, C, O; // 三角形三点与圆心ll r; // 半径// 判断线段是否和圆相交int segOnCircle(Point *p_1, Point *p_2){原创 2016-07-29 17:11:04 · 5039 阅读 · 2 评论 -
51Nod-1298-圆与三角形
ACM模版描述给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出”Yes”,否则输出”No”。(三角形的面积大于0)。Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据。 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R。(-3000 <= xc, yc <= 3000, 1 <= R <原创 2016-07-29 17:19:53 · 1828 阅读 · 0 评论 -
51Nod-1283-最小周长
ACM模版描述题解直接S开方,然后查找符合条件的矩形,输出即可。这里需要强调的是一定要注意输出的是int型,因为我直接cout了double型,所以出现了几组错误答案,这几组输出的结果是科学计数法的结果,略显尴尬,细节决定成败。代码#include <iostream>#include <cstdio>#include <cmath>using namespace std;int main(in原创 2016-07-31 01:41:32 · 971 阅读 · 0 评论 -
计算几何相关公式
ACM模版Pick公式顶点坐标均是整点的简单多边形: 面积 = 内部格点数目 + 边上格点数目 / 2 - 1 S = n + s / 2 - 1 (其中n表示多边形内部的点数,s表示多边形边界上的点数,S表示多边形的面积)原创 2016-07-25 17:07:14 · 1507 阅读 · 0 评论 -
51Nod-1629-B君的圆锥
ACM模版描述题解已知圆锥的面积S,求最大体积V的公式为:V = S * sqrt(S / (72 * Pi))。代码#include<iostream>#include<cmath>#include<cstdio>#define PI 3.1415926using namespace std;int main(){ int s; cin >> s; double re原创 2016-08-04 21:08:31 · 612 阅读 · 0 评论 -
HDU-5572-An Easy Physics Problem
ACM模版描述题解计算几何问题,给定一质点的位置和速度,给定一个圆柱的圆心和半径,质点移动如果撞上圆柱则发生弹性碰撞。问这个点是否可以经过另一个质点。这个题比较直观的想法是求角度,但是这样容易存在精度上的误差,所以可以采用求一个点关于直线的对称点来求出弹性碰撞后的轨迹,判断另一个质点是否在这个质点的运动轨迹上即可。代码#include <cstdio>#include <iostream>#in原创 2017-11-20 16:19:41 · 554 阅读 · 0 评论