
计算几何
二分抄代码
去了18ec没资格去19ec的反向训练选手
展开
-
gym102136C. Kingdom Partition /Aizu - 2786G - Share the Ruins Preservation
https://codeforces.com/gym/102136/problem/Chttps://vjudge.net/contest/145955#problem/G这两题一样啊。。。维护一个前缀凸包和后缀凸包就行了#include<bits/stdc++.h>using namespace std; const int N=2e5+10; struct P{ long long x,y; long long operator *(const P原创 2021-01-29 22:34:05 · 292 阅读 · 0 评论 -
2019ICPC沈阳现场赛 E Capture Stars 圆的反演
https://ac.nowcoder.com/acm/contest/7830/D感觉沈阳的惨败都是上个世纪的事情了。。。刚好牛客国庆集训3把沈阳的题放出来了,拿出来补补,就是个圆的反演水题,当时很多队很早就过了,然而最后也就那么多人过,因为2018-2019年的各种比赛题目中没出现过这题就拿(0,0),半径为2*R当反演圆,然后两个过切点的圆反演过去就是两条直线,吧所有点反演过去就是直线之间的点,因为望远镜的区域跟原来的大圆小圆相切并夹在中间,反演过去就也是夹在中间相切的,半径就知道了,横坐标也原创 2020-10-11 01:28:58 · 305 阅读 · 0 评论 -
hdu6559 The Tower
http://acm.hdu.edu.cn/showproblem.php?pid=6559赛后一分钟过了,整场全员互演,队友改了我原来的代码我不知道,最后5分钟改问题的时候拿的不是原版代码改的。。这题就列一个方程,首先z>=0,那么一定是在上面的面相交的,那么高度一定是0<=l<=h,那么交点的x,y坐标满足在半径为R=r/h*(h-l),所以有z0+vz*t=R,(x0+vxt)^2+(y0+vyt)^2=R^2,就是一个关于t的一元二次方程了注意一元二次方程的特殊情况,如原创 2020-09-06 11:21:57 · 164 阅读 · 0 评论 -
codeforces1354C2 Not So Simple Polygon Embedding
https://codeforces.com/problemset/problem/1354/C2直接上旋转卡壳发现只能解决c1,解决不了c2。。。搞了半天想到一个很简单的做法我们知道正多边形每条边的外角都是(360/2n)度,先把这2n个点求出来,那么令第一个点在(0,0)不懂,其他所有点绕0,0旋转,看用一个与坐标轴平行的正方形去框的长度是多少,也就是max(max(y),max(x)-min(x))。这个东西通过画图可知三分角度是可以求极值的#include<bits.原创 2020-05-17 21:58:55 · 739 阅读 · 0 评论 -
2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G Finding the Radius for an Inserted Circle
https://nanti.jisuanke.com/t/A1283怎么圆的反演全是2017出的题以上面两个圆的切点为反演点,反演半径为R,那么左右两个圆就变成了lx=-R/2和rx=R/2的两条垂直的直线然后与这左右两个圆相切的就是夹在两条直线之间的,又因为与下面的圆也相切,所以所有圆的半径都是R/2,纵坐标减一减就行#include<bits/stdc++.h>using namespace std;const double eps=1e-7;inline int原创 2020-05-13 15:39:40 · 269 阅读 · 0 评论 -
hdu6158 The Designer
http://acm.hdu.edu.cn/showproblem.php?pid=6158三角函数尤其是反三角函数又慢精度又差,能用比例向量和叉积甚至x/sqrt(sqr(x)+sqr(y))这种形式都比反三角函数好这题以两个圆的左边切点为反演中心,大圆的直径为R,大圆的反演结果就是与大圆相切的一条直线,小圆就是更远处的直线,由于反演后的相切性不变,所以3个原反演出2条直线夹着一串圆,而且这些圆也要相切,他们的直径是rx-lx#include<bits/stdc++.h>usi原创 2020-05-13 02:23:21 · 200 阅读 · 0 评论 -
hdu6097 Mindis
http://acm.hdu.edu.cn/showproblem.php?pid=6097我发现仅仅看着那些圆的反演的性质,然而还是不会做题。。。。我们把p点对圆c进行反演得到p2,对q进行反演得到q2,由于三角形ODP~三角形OP2D,因为|OD|*|OD|=r^2=|OP|*|OP2|,所以相似,那么|PD|/|DP2|=|OD|/|OP2|这样P2D+Q2D最小就等价于PD+QD最小那么P2Q2如果与圆有交点,那么两点之间线段最短,D就是与圆的交点否则,则是道P2Q2的中垂线原创 2020-05-12 16:44:55 · 194 阅读 · 0 评论 -
hdu4773 Problem of Apollonius
http://acm.hdu.edu.cn/showproblem.php?pid=47732017ccpc网络赛的时候,我跟szh因为精度不够没过的那道几何题,后来听GB说是要圆的反演,可以提高精度,甚至可以把圆变成线来做。然而我19年学几何的时候忘记了这个知识点,结果19沈阳就出现了,拿坐标公式在那里硬搞。。今天终于想起来了,代码和思路均来自https://www.cnblogs.com/NineSwords/p/9225187.html写的非常好,我突然发现我甚至没写过两个圆的公切线怎么求原创 2020-05-12 01:44:56 · 211 阅读 · 0 评论 -
hdu 6371 Angle Beats
http://acm.hdu.edu.cn/showproblem.php?pid=6731一开始用long double lower_bound超时。。。然后去网上学习了一手分数类写法13s飘过。。。似乎用斜率存unorderd_map可以接近O(n^2)?考虑两种情况,一个是原先的点a[u]为直角,另一个是询问的点的b[u]为直角。a[u]为直角,再枚举一个b[i]为端点,然后...原创 2019-10-17 15:48:47 · 246 阅读 · 0 评论 -
gym 101158J 2016-2017 ACM-ICPC, Asia Tsukuba Regional Contest
比赛的时候spj冇得,以为随便交一发过了爆炸高兴,第一次比赛中写200行的计算几何就1A了,然后rejudge就没了。后来发现确实不能取最小圆覆盖的圆心,而由于这是个凸包,圆心肯定在凸包内时面积才能取到最大值,所以可以再凸包内三分套三分找圆心,可以感受到三分x后三分y一个向上凸的函数,是可以取到极值的。然后套多边形和圆求相交面积的模板就行了。#include<bits/stdc...原创 2019-04-01 22:05:42 · 275 阅读 · 0 评论 -
bzoj1038
想法很简单在每一条线段上三分横坐标然后一定是对于左右的底层端点连到这个横坐标,然后求出高度可以想到这个三分肯定是对的,因为在一条线段上,一定是个凸函数但是精度被卡成傻子在洛谷上eps开1e-9,80分,开1e-10,90分。。。然后不用struct point 的向量写法,直接坐标运算就过了。太毒瘤了。#include<bits/stdc++.h>#...原创 2019-04-10 15:34:12 · 141 阅读 · 0 评论 -
bzoj1007 类半平面交
之前直接套半平面交的板子怎么都过不了后来看博客说这题精度要求太高要去掉eps什么的。。。但我还是WA后来随便写一发,直接用A排序就过了之后纠结半平面交的板子为撒错了首先吧hpicmp的排序改成用A排序,而不是tan2计算出来的k后来发现不能把上口封住,会出问题。而由于没有封口,导致下面的判断首尾合不合法也要去掉这样才能过。。。计算几何急死人系列,上面是随手写的代码,下面...原创 2019-03-22 19:14:00 · 234 阅读 · 0 评论 -
poj 2826
写了一句if(area<0) area=-area;并没毛用,WA一万年,照着discuss里面的说法试了一下printf(area+eps)就过了。。。行行,以后计算几何题一律+eps输出,卧佛了这题讨论还是很多了。首先,我们要找出不会积水的情况1.没有交点2.两线段平行或重合3.有一条线段垂直于地面和天4.一根线段遮挡住了第二根线段,也就是遮挡住了朝天的开口。...原创 2019-03-12 20:05:49 · 212 阅读 · 0 评论 -
2019牛客多校第五场 I three points 1
传送门:https://ac.nowcoder.com/acm/contest/885/I红太阳lts做这题做了5个小时没过。。。然后我觉得他的方法巨对我写了一发也通过0%.学习了FDU老哥的代码,分了12种情况,终于过了。根本思想是一个点固定在矩形的(0,0)的位置,然后旋转另外两条边,让一条边恰好搭在矩形的右边界上(不够长就在下边界上),然后看剩下的一条边的端点是否在矩形内,可以通...原创 2019-08-02 10:39:41 · 175 阅读 · 0 评论 -
POJ 2932 扫描线
第一次做扫描线的题,这应该还算是道比较简单的。。。看题的时候没有注意到input里说没有两个圆是相交的,纠结半天。因为只要判断一个圆是否被其他圆所包含。那么我们只需要找当前这个圆,左端点<=当前圆的左端点 ,那些圆中y在它附近的圆是否完全包含了它,就能判断它是否被别的圆所包含。#include<cstdio>#include<cstring>#inc...原创 2019-03-13 22:28:22 · 137 阅读 · 0 评论 -
HYSBZ 1069 最大土地面积
之前没看到n=2000,计算几何自动脑补复杂度必须O(N) O (nlogn)....然后 打开题解发现可以n^2....那就简单了,枚举对角线,然后左边找个面积最大的三角形,右边再找一个。two points 扫过去,那么复杂度还是O(n^2)的。过样例就A了好爽啊。#include<bits/stdc++.h>#define maxl 2010 #defi...原创 2019-04-08 23:39:31 · 108 阅读 · 0 评论 -
bzoj 2618 半平面交
觉得巨恶心不知道怎么办,结果一看题解发现因为凸多边形相交还是一个多边形,并不会变成多个奇怪的很多个小图形,所以可以直接半平面交求面积,测板子+1,过样例就A真爽。#include<bits/stdc++.h>#define maxl 1010#define eps 1e-8using namespace std;inline int sgn(double x){ i...原创 2019-04-16 21:05:38 · 171 阅读 · 0 评论 -
Gym 101981D 2018南京
最小球覆盖。。。小红书上有O(n)的板子,但这题n只有100..抄了就过了似乎三分套三分套三分也能过?#include<bits/stdc++.h>#define maxl 110#define eps 1e-8struct point{ double x,y,z; point(double a=0,double b=0,double c=0) { ...原创 2019-04-14 22:42:01 · 615 阅读 · 3 评论 -
HDU6590 2019杭电多校第一场1013 code
考场上想到是把二维平面的点用一条线分成两个集合,但是没想到用凸包去判断是否相交跟队友讲了题以后,队友提到了凸包但我没反应过来看了榜以后以为2题已经结束了,后2个小时都在跟隔壁队伍的同学吹水啊。。。。这道水题就没去开了。。。走在路上和队友又聊起这题,突然发现凸包相交就行了。。。然后回机房写了30分钟就过了。。。卧槽,好亏啊,以后比赛一定要每道题都认真思考一下,尽管是过得不多的题,几十...原创 2019-07-22 21:17:25 · 279 阅读 · 0 评论 -
hdu6631 2019杭电多校第五场
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6631本来写得很复杂不知道怎么判下去了之后看了dls的录播发现只需要枚举对称轴在a[i-1],a[i+1]线段的中垂线上或者在a[i],a[i+1]边的中垂线上就行了然后判断剩下的点对的中点是否与在对称轴上且垂直就就行了。一开始T=40的数据错了3个看到某博客里的一种恶心情况:http...原创 2019-08-06 21:33:27 · 312 阅读 · 0 评论 -
hdu6665 Calabash and Landlord 杭电多校第8场
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6665比赛中分情况讨论没过,队友用离散化跑dfs过了,十分精妙赛后把情况讨论分对了,判断完全在外部的情况,相等的情况,两条对边有重合的情况,一个内含另一个但只可能相邻边重合的情况,其他剩下的相交的情况就都是4了。#include<bits/stdc++.h>using nam...原创 2019-08-14 22:26:44 · 199 阅读 · 0 评论 -
2018沈阳gym101955 L Machining Disc Rotors
https://codeforces.com/gym/101955/problem/L周一牙疼,周二拔智齿,周三周四智齿发炎引起发烧躺尸,4天没训练,完了,要打铁了。卧槽赛场上写的nlognlogn一直超时,然后偶像说赛后他n^2过了,然后我改成了nlogn还是超时,主要是这个logn是三分的,而且eps要1e-10,本身就几十了,再乘个常数,就超过100了,因为n只有100。。。。果然计...原创 2019-09-27 21:49:44 · 246 阅读 · 0 评论 -
codeforces613A 点到线段的距离
在网上找到了一个板子,直接运用了点积知道某两条向量的方向呈钝角,就可以得出是某个端点最近,否则就是直接运用叉积的方法,求垂线的高度。其实还可以直接求垂足,然后坐标距离运算#include<bits/stdc++.h>#define maxl 100010using namespace std;const double PI=acos(-1.0);struct p...原创 2019-01-21 16:14:08 · 187 阅读 · 0 评论 -
poj2986 圆与三角形相交面积
同poj3675,而且我自己写的线段与圆求交点还是过不了。。。。#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<vector>#define maxl 510#define eps 1e-10const double...原创 2019-02-20 21:01:25 · 839 阅读 · 0 评论 -
poj3675 求圆与多边形相交的面积
每条线段与原点连起来求在圆内的有向面积,然后输出之前绝对值一下。求三角形在圆内的面积,都在圆内,直接三角形面积,都在圆外且无交点,直接扇形面积,如果一点在圆内一点在圆外的话,求一个扇形一个三角形,两点在圆外但有2个交点,则求2个扇形中间一个三角形的面积。使用点积解方程求线段与圆的交点过不了这题,不知道为何,但用上交小红书的解方程模板就可以#include<cstdio>...原创 2019-02-20 20:39:19 · 246 阅读 · 0 评论 -
zoj1450 最小圆覆盖
随机增量法,期望O(n),小红书模板#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#define maxl 110#define eps 1e-8using namespace std;inline...原创 2019-02-18 22:30:16 · 169 阅读 · 0 评论 -
Gym 101606B 类旋转卡壳
https://cn.vjudge.net/problem/Gym-101606B要把一块多边形饼干放进一个口子里,问口子直径最小是多少其实就把多边形求个凸包,然后对于凸包上每一条边,找一个离这条边最远的点的距离,然后这个距离的最小值就是答案只要把旋转卡壳改一下就行了#include<cstdio>#include<cstring>#include&l...原创 2019-02-14 22:13:40 · 204 阅读 · 0 评论 -
POJ2187 求平面上最远点对
最远点对一定是凸包上的点对,而对于随机数据,凸包上的点会比所有点少很多,所以虽然n=50000,但是求出凸包以后直接枚举也是可过的另外一种方法就是用旋转卡壳来求凸包直径#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<ve...原创 2019-02-14 21:30:36 · 243 阅读 · 0 评论 -
POJ1228 稳定凸包
看题半天没看懂意思,以为就是判断是否有凸包结果。。。。看了题解才知道,是要确定一个凸包是否唯一,即不能通过新增点变成新的凸包,也就是凸包的每条边上至少有3个点。#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<cmath>...原创 2019-02-14 15:57:45 · 164 阅读 · 0 评论 -
codeforces 8D 二分后判断3个圆是否有交集
这题一开始看错题了,原来最多的走的距离是它本身走的最短距离+t,之前以为是比两个路长中较小的那个不超过多少。。。就变成了未知数。设最长路长分别为l1,l2那么如果alan和bob能一直一起走,那么就是最长一起走的路径min(l1,l2)否则就是一起走到P点,假设cinema到P为x,那么x+dis(P,shop)+dis(shop,house)<=l1; x+dis(P,house...原创 2019-01-22 09:18:11 · 879 阅读 · 0 评论 -
POJ2653 用叉积判断线段相交
2019.2.12更新,以前第二条判断完全是错的。。。怎么就过了。。。第一步:先判断一条线段所在直线与另外一条线段相交第二步:再判断另外一条线段所在直线与此线段相交一下代码只能说明有重合部分,并未求出线段交点#include<cstdio>#include<cstring>#include<cmath>#define maxl 10001...原创 2019-01-20 16:09:12 · 213 阅读 · 0 评论 -
POJ3304 求直线和线段是否相交
判断能否找到一条直线使得与每个线段有交点先枚举2条线段,再枚举出2条线段上的各一个端点,来当做直线。判断直线相交直接利用向量线段表示法,然后用叉积去算a是直线的一个点,v是方向向量,b是线段的一个点,w是方向向量假设a+tv是交点cj(a + tv − b,w) = 0cj(a − b,w) + cj(tv,w) = 0t ∗ cj(v,w) = cj(b − a,w)...原创 2019-01-19 22:36:33 · 385 阅读 · 0 评论 -
POJ2398 判断点在线左边
跟POJ2318差不多,不过这次要对线进行排序,对线的排序有涉及到对点的排序#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define maxl 100010#define eps 1e-8using namespace std;int ...原创 2019-01-19 21:13:56 · 196 阅读 · 0 评论 -
POJ2318 二分,判断点在哪条线的左边
判断一个点p在上面是s下面是e的线段左边,右手定则知道叉积小于0,即(s-p) ^ (e-p) <0二分判断在哪条线左边就行了#include<cstdio>#include<cstring>#include<cmath>#define maxl 100010#define eps 1e-8using namespace std;...原创 2019-01-19 20:28:47 · 198 阅读 · 0 评论 -
HDU6325 Problem G. Interstellar Travel
考场上看都没看这题。。。因为一直WA A题,只要把那个式子看出来是叉积,然后再联想到叉积之和就是面积大小,就可以知道最小的cost就是上凸包最大的面积,都不用什么特殊的做法,首先相同x坐标,必取y大的,上凸包的拐点必取,然后同斜率上一条线上的点,从后往前维护ind的最小值,如果当前的ind比他后面的点ind更小,那么比取,以得到最小的字典序。值得注意的是,对于x,y相同的点,必取ind小的,我一开...原创 2018-07-31 11:06:38 · 308 阅读 · 0 评论 -
poj1279 不规则多边形的核,用半平面切割多边形 O(n^2)
//const double inf=1e9;//求半平面切割多边形的时候,要先放入4个极限点当整个平面,再求面积,但是由于double只能存1e300+的数,而如果inf=1e15-18就很容易在中间有乘法的计算过程爆炸损失精度,所以inf要根据题意来设置#include<cstdio>#include<cstring>#include<algorith...原创 2019-02-15 17:14:24 · 239 阅读 · 1 评论 -
zoj2107 平面最近点对
先按照x排序,然后分治,先求出左边一半的最小值,再求出右边一半的最小值。最后只要考虑跨过中间mid 的 点对是否为最小距离就行了假设当前最短距离时ans,我们找到x坐标在(a[mid].x-ans,a[mid].x+ans)之间的点,然后对他们按照y坐标排序,对于每一个点,只要找离它y坐标最近的5个点更新最短距离就行了,可以画图理解为啥是5个但是书上写的是6个,也有博客说7个。。。...原创 2019-02-21 16:47:38 · 186 阅读 · 0 评论 -
poj2451 半平面交 nlogn
注意一开始要0 0 10000 0 10000 10000 0 10000 的边界#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<dequ...原创 2019-02-15 21:56:05 · 294 阅读 · 0 评论 -
poj1265 求多边形内部的点和边界上的点
pick公式:给定顶点坐标均是整点的简单多边形,面积=内部点+边上点/2+1对于一个多边形,由于要左闭右开的线段避免重复计算边上点每条边上的个点数为gcd(x2-x1,y2-y1)#include<cstdio>#include<cmath>#define maxl 100010#define eps 1e-8inline int sgn(doubl...原创 2019-02-12 22:08:33 · 1077 阅读 · 0 评论 -
poj1385 求多边形重心
把多边形分割成三角形,对每个三角形求重心,再根据三角形的有向面积为权值求加权平均#include<cstdio>#include<cmath>#define maxl 100010#define eps 1e-8inline int sgn(double x){ if(x>-eps && x<eps) return 0; i...原创 2019-02-12 21:24:53 · 239 阅读 · 0 评论