计算几何
Clove_unique
All that you have lost can be won back bit by bit as long as you wish for it.
展开
-
[BZOJ2584][Wc2012]memory(扫描线+splay+线段树)
题目描述传送门题目大意:在二维平面中有n个线段,线段互不相交,每一次一个操作将一个线段向四个方向之一移走(也就是平移到无穷远处),如果移动的过程中被其他线段所阻挡则移动是不合法的。求:最早的一次不合法移动;构造一种合法的移动序列将所有线段移走题解首先考虑第二问,实际上所有的线段都按照任意一个固定的方向移动就是可以直接都移走的,所以我们需要将线段编号。因为线段均不相交,所以对于任意两条线段的所有横坐标原创 2017-04-22 19:05:48 · 1295 阅读 · 0 评论 -
[BZOJ2618][Cqoi2006]凸多边形(半平面交)
题目描述传送门题解半平面交裸题 注意判断直线和线段是否相交的时候要特判线段在直线上的情况,否则有可能导致被0除代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 505const double eps=1e原创 2017-01-18 09:26:49 · 786 阅读 · 0 评论 -
[BZOJ1038][ZJOI2008]瞭望塔(半平面交)
题目描述传送门题解首先把底下的直线都用半平面交搞一下,然后上面会形成一个凸壳 那么答案一定在底下的转折点或者凸壳上的定点取到 因为…分段函数的极值一定在分段点? 然后暴力、枚举、求交点… 可关键是这题的精度丧心病狂啊…我的代码精度<=1e-9,半平面交的初始范围必须是1e10或者1e11才对…代码#include<algorithm>#include<iostream>#include<原创 2017-01-18 18:29:16 · 738 阅读 · 0 评论 -
[BZOJ2732][HNOI2012]射箭(二分+半平面交)
题目描述传送门题解首先可以二分答案 如何判定? 对于每一个靶子 ax2+bx−y2<=0ax^2+bx-y_2<=0 ax2+bx−y1>=0ax^2+bx-y_1>=0 x,y1,y2x,y_1,y_2是常数,就相当于是两个关于a,b的方程,然后搞两个半平面(详情参考高中数学课本必修5线性规划问题) 所有的半平面有交说明有解 不过这道题精度很卡,建议eps开小一点然后用long do原创 2017-01-20 20:39:06 · 630 阅读 · 0 评论 -
[BZOJ2178]圆的面积并(辛普森积分)
题目描述传送门题解这里的辛普森积分就不是算函数值了,而是算覆盖到的长度 有一个横坐标了之后O(n)O(n)枚举圆算弦长然后做一遍线段覆盖就行了 一遍过样例感觉好爽 然而被卡得狂T不止 主要有两个优化: ①调用simpson的时候多记录几个f值在下一次少算一些。能快好多 ②把内含的圆去掉。能快好多好多代码#include<algorithm>#include<iostream>#inc原创 2017-01-18 16:36:51 · 1220 阅读 · 0 评论 -
[HDU1724]Ellipse(辛普森积分)
题目描述传送门题解辛普森积分裸题 答案要乘2吖,因为椭圆是两半代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const double eps=1e-10;int dcmp(double x){ if (x<=e原创 2017-01-18 14:59:46 · 888 阅读 · 0 评论 -
[BZOJ1336][Balkan2002]Alien最小圆覆盖(最小圆覆盖)
题目描述传送门题解最小圆覆盖:随机增量法 欢迎来抄模板题代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 100005const double pi=acos(-1.0);const double ep原创 2017-01-18 08:41:16 · 485 阅读 · 2 评论 -
[BZOJ2829]信用卡凸包(凸包)
题目描述传送门题解和Wall那道题有点像,先求一个凸包然后加上一个圆周 注意输入的是“圆滑处理前”的a和b,需要自己砍掉半径代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 400005const dou原创 2017-01-18 08:04:24 · 963 阅读 · 0 评论 -
[BZOJ1670][Usaco2006 Oct]Building the Moat护城河的挖掘(凸包)
题目描述传送门题解凸包裸题。代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 5005const double eps=1e-9;int dcmp(double x){ if (x<=eps&&原创 2017-01-18 07:36:44 · 574 阅读 · 0 评论 -
[BZOJ1137][POI2009]Wsp 岛屿(半平面交)
题目描述传送门题解这道题路径的交点处是可以随意通行的 如果1->n是可通行的那么直接走就行了 如果不能通行 对于每一个点i,找出它能直接走到的编号最大的点,显然只有这个点是有用的 然后从点i向这个点连一条直线,加上n->1这条直线,实际上交出了一个凸多边形 答案即为这个凸多边形的边长-1->n的路径长代码#include<algorithm>#include<iostream>#inc原创 2017-02-17 08:45:51 · 656 阅读 · 0 评论 -
[BZOJ3190][JLOI2013]赛车(计算几何+单调栈)
题目描述传送门题解一辆赛车行驶的路程就是v*t+k 看成一条条直线就是水平可见直线那道题了… 按照斜率排序之后用单调栈维护,每一次计算交点然后判断是否覆盖就行了 最后栈中且和下一条直线交点的横坐标>=0的直线是合法的坑点: 判断平行直线,选b最大的 判断重合直线,栈中只能保留一条,最后输出的时候将所有的全部输出 (不能直接在维护的时候打标记,因为有可能在以后弹出) 题面说得很清楚,只要原创 2017-02-16 20:45:49 · 732 阅读 · 0 评论 -
[POJ2451]Uyuw's Concert(半平面交)
题目描述传送门题解nlogn半平面交 atan2精度太差,cmp不能加eps代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 50005const double eps=1e-9;int dcmp(do原创 2017-01-19 21:30:48 · 559 阅读 · 0 评论 -
[BZOJ2300][HAOI2011]防线修建(凸包+splay)
题目描述传送门题解将删除转化成倒序插入 首先对于初始点建立凸包,每一次插入,在凸包上找到离这个点最近的两个点然后不断向两边删点维护凹凸性 可以用splay维护 这道题还是比较简单的,没有重点并且点的坐标∈(0,n)\in(0,n),所以这只是一个上凸壳,随便维护一下就行了 如果是一个完整的凸包的话,用斜率乱判会更麻烦一些代码#include<algorithm>#include<iostr原创 2017-01-06 09:01:09 · 712 阅读 · 0 评论 -
[BZOJ1857][Scoi2010]传送带(三分套三分+计算几何)
题目描述传送门题解感觉一下好像在传送带上走的太多或者走得太少时间都不是最优的 实际上答案对走的长短单峰 然后就三分套三分。。。代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const double eps=1e-4;i原创 2017-01-05 19:50:06 · 592 阅读 · 0 评论 -
[BZOJ1185][HNOI2007]最小矩形覆盖(凸包+旋转卡壳)
题目描述传送门题解首先先求一个凸包,矩形一定是把这个凸包覆盖掉 猜想:最小矩形的某一边一定和凸包的某一边重合 那么如何来证明呢? 可以用反证法。假设最小矩形不过凸包上的任意一条边,那么凸包最多有4个顶点在矩形上,可分为3种情况 1、凸包有2个顶点在矩形上 假设旋转了外接矩形一个角度,使其与对角线a夹角为α\alpha,那么新的矩形(用虚线表示)面积S=a2sinαcosα=12a2si原创 2017-01-04 23:53:51 · 837 阅读 · 0 评论 -
[BZOJ4561][JLoi2016]圆的异或并(扫描线+splay)
题目描述传送门题目大意:在平面直角坐标系中给定N个圆。已知这些圆两两没有交点,即两圆的关系只存在相离和包含。求这些圆的异或面积并。异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑。题解这题并没有做出来。。想了很多很多种不科学的方法。。 首先对于一个圆来说,可以将其分成上半个圆弧和下半个圆弧,并且在扫描整个圆的过程中(对于每一个横坐标),两个圆弧的相对位置不变。对于圆原创 2017-04-22 18:48:36 · 1015 阅读 · 0 评论 -
[BZOJ4445][Scoi2015]小凸想跑步(半平面交)
题目描述传送门题目大意:一个凸n边形,N个顶点按照逆时针从0~n-l编号。现在小凸随机选择多边形中的某个位置,标记为P点。将P点与n个顶点各连一条边,形成N个三角形。如果这时P点,0号点,1号点形成的三角形的面 积是N个三角形中最小的一个,小凸则认为这是一次正确站位。现在小凸想知道他一次站位正确的概率是多少。题解设选的位置坐标为(x,y),用叉积化一下式子 (x1−x)(y2−y)−(y1−y)原创 2017-05-04 14:02:10 · 1056 阅读 · 0 评论 -
[BZOJ1845][Cqoi2005] 三角形面积并(计算几何+扫描线)
题目描述传送门题目大意:给出n个三角形,求它们并的面积。题解求出所有直线的交点,然后按照这些交点的横坐标做扫描线 相邻两条扫描线中间的一定是若干个梯形,面积可以直接用(上底+下底)*高/2计算 但是需要注意的是三角形的一条边和y轴平行的情况,若这条边是三角形的起始边,当前扫描线和下一条扫描线之间的答案应该计算这条边;若这条边是三角形的终止边,当前扫描线和下一条扫描线之间的答案不应该计算这条边,特原创 2017-04-21 16:16:56 · 963 阅读 · 0 评论 -
[BZOJ2756][JLOI2010]铁人双项比赛(半平面交+三分法)
题目描述传送门题目大意:n个人参加比赛,先跑步和自行车的总路程为s,其中跑步为k,走路为r,每个人跑步和自行车都有一个速度。求出对第n个人最有利的k和r,使其获得冠军,并且领先第二名的时间最多。题解首先将每个人的k-时间方程写出来 y=x/v1+(s-x)/v2=(1/v1-1/v2)x+s/v2 这样得到了n个方程,用半平面交求凸壳(其它比半平面交高明到不知道哪里去了的办法都资瓷 求出凸壳之后原创 2017-05-04 09:03:36 · 1011 阅读 · 0 评论 -
[BZOJ2338][HNOI2011]数矩形(计算几何)
题目描述传送门题目大意:给出二维平面上的n个点,求一个最大的矩形,它的顶点都在给出的点上。题解首先预处理出所有的线段,中点相同、长度相同的两条线段可以组成一个合法的矩形 将所有的线段按照一维中点、一维长度、一维斜率排序,对于中点相同、长度相同的线段必定在一段区间里,并且对于一条线段,取到最大值的另一条线段单峰,用两个指针扫一下就行了代码#include<algorithm>#include<io原创 2017-05-02 19:06:36 · 638 阅读 · 0 评论 -
[BZOJ1132][POI2008]Tro(计算几何)
题目描述传送门题目大意:平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和。题解枚举每一个点,以它为原点建立平面直角坐标系,然后其他的点按照极角排序。 向量的叉积满足分配律,所以可以two pointer一下,每一次右指针移动到最后一个与左指针夹角小于180°的地方,然后每加入一个向量,计算一下这个向量与两个指针之间所有向量的叉积,利用分配律。 看了PoPoQQQ的题解才发现,其实不用这原创 2017-05-02 15:42:27 · 791 阅读 · 0 评论 -
[BZOJ2539][Ctsc2000]丘比特的烦恼(KM+计算几何)
题目描述传送门题目大意:这题说了题目大意就没意思了。题解KM裸题(笑 http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=4169代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<map>us原创 2017-04-18 20:42:15 · 1022 阅读 · 0 评论 -
[POJ2079]Triangle(凸包+旋转卡壳)
题目描述传送门 题意:给出一些点,求顶点在这些点上的面积最大的三角形题解其实这不算一个旋转卡壳吧… 很容易得出一个结论,最大的三角形一定是凸包上的边加上离它最远的点 这个结论是错误的!\color{red}{这个结论是错误的!} 反例也很容易举出: 所以我们只能固定两个点然后让第三个点单调 所以这道题实际上是O(n2)O(n^2)的,虽然有5w个点,但是凸包上的点远远达不到这个级别代原创 2017-01-04 15:21:07 · 654 阅读 · 0 评论 -
计算几何 学习笔记
向量、直线与多边形精度控制控制精度一般在10−710^{-7}~10−1010^{-10}之间const double eps=1e-7;int dcmp(double x){ if (fabs(x)<eps) return 0; else return (x>0)?1:-1;}计算π的值\pi的值反余弦函数const double pi=acos(-1.0);定义一个向量st原创 2017-01-05 08:21:43 · 1517 阅读 · 4 评论 -
[BZOJ4206]最大团(计算几何+dp)
题目描述传送门题解非二分图的最大团问题是npc hard(我不会告诉你我刚知道) 所以今天gang了半天是毫无意义的(逃一个非常奇妙的转化 首先圆内和圆上的点扔掉 对于每一个点做它的两条切线,每个点的两个切点在圆上会形成一段连续的弧,两个点不能同时选,当且仅当两个弧相离或包含 栗子: 这两种情况都是不行的 将圆展成一条链,跨越端点的线段就改为它的补集 这样问题就变成了在一坨线段原创 2017-03-05 20:39:16 · 1272 阅读 · 0 评论 -
[BZOJ1069][SCOI2007]最大土地面积(凸包+旋转卡壳)
题目描述传送门题解感觉这样的题就是寻找题目的单调性。。。 枚举一个对角线,然后在对角线的两边分别选一个点,这两个点满足单调 时间复杂度O(n2)O(n^2) 这道题卡时非常丧病 能用叉积的尽量用叉积,少用比如说DisTL之类的函数 调用控制精度的dcmp也会慢一丢丢代码#include<algorithm>#include<iostream>#include<cstring>#inc原创 2017-01-04 22:48:56 · 470 阅读 · 0 评论 -
[BZOJ1913][Apio2010]signaling 信号覆盖(计算几何+组合数学)
题目描述传送门题解非常神奇的一道思路题,刚开始只会sb暴力 这篇题解讲得非常好orz:http://blog.csdn.net/qpswwww/article/details/45334033代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namesp原创 2017-02-07 19:04:37 · 699 阅读 · 0 评论 -
[POJ3304]Segments(计算几何)
题目描述传送门 题意:给出一些线段,问是否存在一条直线,使所有线段在直线上的射影至少有一个公共点。题解如果所有线段在直线上的射影至少有一个公共点的话,那么过这个点做这条直线的垂线,垂线一定与所有线段都相交 问题可以转化为判断是否存在一条直线与所有线段都相交 猜一猜就知道只有线段的端点是有价值的对吧,也就是说,可以枚举所有的端点,两个端点就能确定一条直线,然后再判断这条直线是否能与所有线段都相交原创 2017-01-01 20:25:47 · 435 阅读 · 0 评论 -
[POJ2398]Toy Storage(计算几何+二分)
题目描述传送门题解同POJ2318代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<ctime>using namespace std;#define N 10005const double eps=1e-9;int dcmp(double x){ if (x<=e原创 2017-01-01 16:42:05 · 379 阅读 · 0 评论 -
[POJ1228]Grandpa's Estate(凸包)
题目描述传送门 题意:给出凸包上的一些点,问是否能唯一确定一个凸包题解很显然能确定唯一凸包的条件是凸包上的每一条边上都至少有三个点 求出凸包之后根据叉积判断就行了至少有三个顶点每条边上至少有三个点代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using原创 2017-01-03 11:39:36 · 442 阅读 · 0 评论 -
[POJ1265]Area(计算几何)
题目描述传送门题解Pick定理:一个计算点阵中顶点在格点上的多边形面积公式:S=a+b/2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,S表示多边形的面积。 那么a=(2S-b+2)/2 S可以通过叉积求出 计算b的方法是:某一条边(x,y)上的整点的数量是gcd(|x|,|y|)+1代码#include<algorithm>#include<iostream>#inc原创 2017-01-02 21:41:07 · 435 阅读 · 0 评论 -
[POJ2007]Scrambled Polygon(计算几何)
题目描述传送门 题意:给出一个起点和一个凸多边形,要求从起点开始逆时针输出凸多边形的所有顶点题解很多人说是极角序,其实极角应该是向量(x,y)和x轴正方向的夹角,范围是[−π,π-\pi,\pi] 我感觉直接极角排序不是很科学,因为起点不确定 所以直接利用叉积的性质来排序就可以了,也就是将所有点和起点求叉积代码#include<algorithm>#include<iostream>#in原创 2017-01-03 09:56:14 · 1049 阅读 · 0 评论 -
[POJ2954]Triangle(计算几何)
题目描述传送门 题意:给出一个顶点都是整点的三角形,求三角形内部的整点的个数。题解Pick定理:一个计算点阵中顶点在格点上的多边形面积公式:S=a+b/2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。 那么a=(2S-b+2)/2 S可以通过叉积直接求出 计算b的方法是:某一条边(x,y)上的整点的数量是gcd(|x|,|y|)+1代码#include<al原创 2017-01-02 21:08:17 · 472 阅读 · 0 评论 -
[POJ1654]Area(计算几何)
题目描述传送门 题意: 1右下2右3右上4下5回到原点6上7左下8左9左上 起点在原点,按照操作进行,走出来一个多边形,求多边形的面积。题解这题好毒啊… 比较卡内存,1500+的MLE看起来很多人都不看题… 然后就是貌似double会炸精度,从走法上看最后的面积只有可能是整数或者0.5的小数,于是用longlong然后最后特判一下就行了代码#include<algorithm>#incl原创 2017-01-02 19:35:16 · 376 阅读 · 0 评论 -
[POJ1584]A Round Peg in a Ground Hole(计算几何)
题目描述传送门 题意: 给出一个半径R、一个点O、顺时针或者逆时针给出一个多边形 首先判断多边形是否为凸多边形,如果不是输出HOLE IS ILL-FORMED 然后再判断以O为圆心以R为半径的圆是否完全在多边形里,是则输出PEG WILL FIT,否则输出PEG WILL NOT FIT题解判断凸多边形用叉积判断即可 然后可以利用判断点是否在多边形内的方法(射线法)来做第二问代码#inc原创 2017-01-02 15:39:33 · 476 阅读 · 0 评论 -
[POJ1410]Intersection(计算几何)
题目描述传送门 题意:给出一条线段和一个矩形,判断它们是否有公共点题解先判断线段和矩形的每一条边是否相交 然后再判断线段是否在矩形内部 由于是一个简单的矩形不是多边形只需要判断坐标范围就行了 矩形的坐标给出的是无序的,需要自己排序代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#inclu原创 2017-01-02 11:06:12 · 538 阅读 · 0 评论 -
[POJ2826]An Easy Problem?!(计算几何)
题目描述传送门 题意:给出两条线段,雨水从空中竖直落下,问线段上能积多少水。题解情况比较多,需要特判的地方也比较多 首先要判断线段是否相交(叉积),假设线段相交 最简单的当然是这种情况 不过还会有一些特殊情况 这样的情况都是没有办法积水的 所以需要用斜率什么的各种特判 最后输出的时候+eps,貌似是什么奇怪的bug,让double运算的时候出了负数,然后就会有什么-0.00之类原创 2017-01-02 09:54:33 · 445 阅读 · 0 评论 -
[POJ2653]Pick-up sticks(计算几何)
题目描述传送门题解不知道为什么这道题O(n2)O(n^2)暴力就可以 然后就是判断线段是否相交 首先一条线段确定一个向量,在由这个向量的起点向另一条线段的两个端点引两个向量,把这两个向量分别和第一个向量做叉积然后判断是否异号 需要正反做两次,否则只是判断直线和线段相交的做法代码#include<iostream>#include<cstring>#include<cstdio>using原创 2017-01-01 22:53:10 · 410 阅读 · 0 评论 -
[POJ1269]Intersecting Lines(计算几何)
题目描述传送门 题意:每次给出两条直线,判断是否平行、重合、相交,相交的话就交点。题解判断两条直线是否平行 两条直线各任选两个点组成两个向量平行(叉积为0)判断两条直线是否重合 在平行的基础上,在两条直线上各选一个点组成一个向量在去与前两个判平行(叉积为0)求交点的话用直线的分点(比值)+叉积面积法求解代码#include<algorithm>#include<iostream>#incl原创 2017-01-01 20:37:06 · 444 阅读 · 2 评论 -
[BZOJ1610][Usaco2008 Feb]Line连线游戏(计算几何)
题目描述传送门题解两两枚举点求直线 相同斜率的只能画一条代码#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 40005const double inf=1e9;const double eps=1e-9;原创 2017-01-01 20:44:34 · 412 阅读 · 0 评论