![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算几何
小青WA
扣扣1916493526
展开
-
AcWing 3074. 自适应辛普森积分 3069. 圆的面积并[BZOJ2178]
模板题3074. 自适应辛普森积分题意思路辛普森积分:(r - l) * (f(l) + f(mid) * 4 + f(r)) / 6.0 指过l,r,(l + r) / 2 三处确定点在抛物线上的积分的面积自适应辛普森积分:每次找l~r与l~mid+mid~r比较fabs<eps说明已经精确可用(对二次函数次数更高就不好说了)过程就是递归代码#include<cstdio>#include<iostream>#include<...原创 2021-02-15 01:07:19 · 250 阅读 · 0 评论 -
AcWing 2801. 三角形面积并 [CQOI2005] 扫描线
题目思路代码#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<vector>using namespace std;const double eps = 1e-6;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;const int MaxN =原创 2021-02-13 01:18:04 · 200 阅读 · 0 评论 -
AcWing 3034. 望远镜 POJ3675 三角剖分求圆与多边形的面积交并
题意https://www.acwing.com/problem/content/description/3037/求以原点为圆心的圆与一个简单多边形的面积交思路将多边形每条边与圆心相连求出其围成的有向三角形面积(三角剖分思想)相加即为答案求次面积交要考虑的状态如下:(设多边形某条边上的两端点为Point a,b,如果线段ab与圆有交点设交点为papb)1.a b均在圆内 S= Cross(a,b)/2;2.ab均在圆外①ab与圆心O的距离 >= R, S ...原创 2021-02-10 17:25:25 · 259 阅读 · 0 评论 -
AcWing 2119. 最佳包裹 (三维几何基础三维凸包)
三维凸包模板增量算法复杂度O(n^n)枚举点集每次看点与当前所有面的关系Pr能照到的面删除剩下的保留搭配np[]再将交界处的边与Pr的连接面加入np[]注意需要对数据微小扰动防止存在四点共面#include<cstring>#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>using namespace std;c...原创 2021-02-07 19:34:29 · 208 阅读 · 0 评论 -
AcWing 2785. 信号增幅仪
题意https://www.acwing.com/problem/content/description/2787/给你一个椭圆的倾斜角和短半轴与长半轴的比值问你将n个点全部覆盖的最小短半轴椭圆是多少思路根据椭圆的标准方程考虑将坐标压缩已知P =a / b , x' = x / P,y' = y 满足 x'² + y'² = 1;所以坐标先顺时针旋转后再压缩就变成了一个最小圆覆盖问题!代码#include<cstdio>#include<...原创 2021-02-07 00:25:00 · 166 阅读 · 0 评论 -
AcWing2957. 赛车
题意https://www.acwing.com/problem/content/2960/思路每个赛车的方程y =vi * t + ki;可知这是一个在x正半轴的(t >= 0)的半平面交添加两条封口的L 对于每条方程维护左边区域所有在core上的边/点都满足曾经不慢于others的条件有重边要处理一下代码#include<cstdio>#include<iostream>#include<algorithm>#includ...原创 2021-02-03 23:59:19 · 101 阅读 · 0 评论 -
uva10173 最小矩形覆盖
题意给你一个点集求出能覆盖这个点集的最小矩形面积思路代码#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;const double eps = 1e-8;const double pi = acos(-1.0).原创 2020-12-08 21:52:10 · 115 阅读 · 0 评论 -
poj3608 两凸包间最小距离 旋转卡壳
题意给你两个凸多边形问你两凸多边形的最近距离思路找到凸包 p 的 y 值最小点 yminP 和 q 的 y 值最大点ymaxQ枚举P[yminP]-P[yminP + 1]这条边与Q[ymaxQ]Q[ymaxQ]旋转卡每次找到最近后min(四个点两条边的距离)代码#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>using name...原创 2020-12-06 20:32:37 · 171 阅读 · 0 评论 -
bzoj1069最大土地面积(旋转卡壳)
bzoj1069给你n个点围成的土地让你选择四个点使构成的土地面积最大注:求对踵点的时候记录每对对踵点的len及dzd[]数组以便计算面积从第一对对踵点开始CD分别是当前对踵点(最大土地面积的对角线)对应的另外两个点显然寻找CD的过程同样符合旋转卡壳的单调性所以可以O(n)维护出最大面积#include<cstdio>#include<iostream>#include<algorithm>#include<cmath&g...原创 2020-12-04 20:01:34 · 208 阅读 · 2 评论 -
2018icpc沈阳L Machining Disc Rotors 求圆与圆的交点
题意T组(5000)每组给你一个圆心在(0,0)半径R的圆 和n(100)个圆的圆心和半径分别与circle(0,0)相交 重叠部分删去 题目保证这n个重叠间相互不重叠 问你对于Circle(0,0)剩下的区域中最远两点的距离思路先求出圆圆交点 再对于这些交点构成的凸包旋转卡壳求平面最远点对(这里时间给了8s 不卡壳暴力也能过)需要注意的是 在对凸包卡壳之前要判断 是不是存在一个交点在Circle(0,0)上的对称点不在那n个圆内 此时ans = R 否则答案才是凸包最远点对求两圆交点.原创 2020-12-03 22:13:27 · 206 阅读 · 0 评论 -
poj2187 旋转卡壳模板 求平面最远点对 + poj2079 求平面选三个点围成最大三角形面积
题意n个点求最远点对的平方思路旋转卡壳模板m==1 || m == 2的情况直接特判逆时针枚举每一条线及当前线上两点(a[i],a[i+1])的可能对踵点(a[j])因为j对于i,i+1而言存在先单调增再单调减的过程,所以直接先前推进j(j = (j + 1) % m)RotatingCalipers O(n) 凸包O(nlogn)复杂度O(nlogn)代码#include<cstdio>#include<iostream>#includ...原创 2020-12-02 18:06:50 · 119 阅读 · 0 评论 -
2018CCPC吉林E The Tower
题意给你一个锥心位于(0,0,0)的圆锥体给出rh再给你一个人的坐标(x0,y0,z0)和他三个方向的速度(vx,vy,vz)问你人和锥体相撞的最短时间是?思路列出各种不等式然后各种代换解二元一次方程这玩意儿是真难算啊 过程如图(字丑写给自己随意看的):代码#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>using nam...原创 2020-12-02 01:35:12 · 158 阅读 · 2 评论 -
2019CCPC秦皇岛A Angle Beats
题意给你n个点(p[])再给你m个查询每次一个点(A[])问你与当前查询点能构成直角三角形的点对有多少对?题目多组思路好怪异啊hdu6731上给的15sgym102361上给的4s(好像比赛的时候就是4s)大体思路:A作直角顶点 +A不作直角顶点两种做法:1.离线去做,对于A作直角顶点的情况,每次从A[]里选择一个点作为极角排序的参照点对p[]排序然后O(n)枚举与A相连边的i及此时有多少j满足∠iAj=90复杂度q*n*logn对于p作直角顶点的情况,每次从p[...原创 2020-11-29 21:33:58 · 119 阅读 · 0 评论 -
poj2354 地球坐标系求球体两点间的距离
题意给你地球上两点的经纬度求球面距离思路//d(x1,y1,x2,y2)=r*arccos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2))//x1,y1是纬度\经度的弧度单位,r为地球半径角度 =d + m / 60.0 + s / 3600.0;代码#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#..原创 2020-11-26 16:19:40 · 386 阅读 · 0 评论 -
poj1375 解析几何 求点与圆切线在幕布上的映射(求切线)
题意:给你一个光源和n个圆形障碍物,现在光源向y = 0投影问你被圆遮住的阴影区段有哪些?思路:图是偷的qaq可以求出图中∠a和∠b投影到下面幕布的区段: (b-a的正负不打紧,我们根据角度求映射距离,负角就变成了O.x+……了)double OA = dis(O,a[i]);//圆心与光源的距离double a = asin(a[i].r/OA);//R对角的角度double b = asin((O.x-a[i].x)/OA);//圆心与y轴的角度ans[i].L = ...原创 2020-11-25 15:22:20 · 177 阅读 · 0 评论 -
2018icpc EC-final F gym102056
题意:给你一个实心球的球心+R给出S、T两点在三维空间的坐标问你S走到T的最短距离思路1.dis_st == 0.02.∠S或∠T >= pi/2说明直线必定不与球相交3.O到ST的距离H >= R也不相交4.常规相交:分别求出S、T与球相切这段的距离(勾股定理)、求出绕球(圆切面)的弧线距离L =πR这里求弧度需要用到余弦定理求H:正弦定理面积=H*L上代码#include<cstdio>#include<iostr...原创 2020-11-25 02:15:54 · 201 阅读 · 0 评论 -
poj2540 半平面交求可行性区域解线性规划
题意:现有一个[0,0]到[10,10]的方格子,已知这里面有一点火源,但你不知道其确切位置你初始在(0,0)每次移动到下一个点并告知你距离火源和上一次比较是更近还是更远或者Same。对于每次移动你需要给出目前火源可能在的区域面积。思路:每次找到lst与cur点的中垂线,显然hotter的一边计入答案与原先剩下的面积半平面交求中垂线:中点为mid,法向量Fa,中垂线向量(mid,end) end =mid+Fa; Vector QAQ; QAQ.x = cur.x -...原创 2020-11-23 18:39:51 · 143 阅读 · 0 评论 -
poj1755 半平面交解不等式
题意给你n个人铁人三项的速度(n<=100),每项比赛长度可调节,问你对于每个人来说,调节比赛长度这个人有没有获胜(比剩下人都快)的可能。思路三项速度设为ui,vi,wi长度a b ct = a / ux+ b / vx+ c / wx;获胜需满足对于所有i: (1/ux - 1/ui)*a + (1/vx - 1/vi)*b + (1/wx - 1/wi)*c < 0已知c!=0,那么可将c除过去即 (1/ux - 1/ui)*a/c + (1/vx - 1/...原创 2020-11-23 01:33:01 · 269 阅读 · 2 评论 -
POJ3384 多边形内两定R内圆最小覆盖
题意顺时针给出一个凸多边形 要在多边形内放入两个半径为R的圆问这两个圆最小覆盖面积(==多边形尽量被圆覆盖)两个圆的圆心?思路对每条线向内平移R求凸核此时凸核内距离最远的两点就是圆心要注意存在凸核中只有一个点的情况。上代码#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>using namespace std;const dou...原创 2020-11-19 17:39:21 · 284 阅读 · 0 评论 -
poj3525 计算凸多边形最大内接圆(二分+半平面交 )
题意给你一个凸包问你凸包的某一点到每条边的最短距离最大?思路题目的实质就是多边形的最大内接圆半径!二分圆的半径mid,用半平面交验证,每条直线向内平移mid的距离,之后跑一遍半平面,判断有没有凸核,若有凸核,l=mid(进一步扩大范围),else r=mid将逆时针凸包中每条边向内推进R的实现:直线平移!把直线表示成Ax + By + C = 0后(已考虑顺逆时针所带来的正负号问题),把直线向内推进d时,只需要写:c += d * sqrt(a*a + b*b); ..原创 2020-11-19 14:39:34 · 558 阅读 · 0 评论 -
半平面交模板
题目:按顺序给出多边形的点问你是否有核?半平面交:1.把输入点的顺序捋成逆时针2.对所有边排序极角小的在前极角相同最右边的方最前面3.根据2的排序去重4.模拟双端队列求出构成核的直线集合:每次判断前两条边的交点在当前边的右边与否5.判断双端队列里元素的个数 >=3 YES为啥子双端队列呢因为极角排序这其实是个环所以记得判一下首尾连接处。6.齐活NICE!上代码!#include<cstdio>#include<iostream&...原创 2020-11-16 23:20:54 · 145 阅读 · 2 评论 -
poj1873 The Fortified Forest (状压+凸包)
题意:平面上有n棵树(2~15),现在要砍掉其中的一部分来做成篱笆将剩下的树包围起来,现在给出每棵树的坐标、价值和可以制造篱笆的长度,求砍掉最少价值的树,将剩下的树包围起来,当两种方式的价值相同时,取砍掉树更少的方式。输出砍掉的树和篱笆剩余多少。思路位运算枚举砍掉的树的L和保留的树的凸包周长。代码#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>.原创 2020-11-11 11:17:27 · 118 阅读 · 0 评论 -
poj1265 皮克公式 求多边形面积(凹凸)
题意一机器人从原点出发进行n 次移动,每次向右移动dxi,向上移动dyi,求画成的多边形内部有多少格点,边界上有多少格点,及其面积多大?皮克公式:S =内部点 +边界点/2 - 1;求出多边形面积(叉积),gcd求出边界点,皮克公式推内部点。顺便一提这题不知道为啥poj又是交G++waC++AC……#include<cstdio>#include<iostream>#include<algorithm>#include<cm...原创 2020-11-06 21:05:59 · 282 阅读 · 0 评论 -
Graham Scan O(nlogn) poj1228稳定凸包
1.找左下角点p[0]2.以p[0]为C极角排序(叉积同角度dis取min)3.遍历叉积判断p[i]加进凸包队列后前面哪些点pop可以保证在最差情况下也能在O(nlogn)的时间复杂度求出结果#include<cstdio>#include<iostream>#include<algorithm>#include<cmath> using namespace std;const double eps = 1e-8;con...原创 2020-11-05 22:07:37 · 132 阅读 · 0 评论 -
poj1556 线段相交+最短路
题意:10*10迷宫,n堵墙,求(0,5)到(10,5)的最短距离找出墙边缘点和起止点两两之间是否可以直线直接通过(不与其他墙相交)可以的话存图跑一遍dij#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<string>#include<vector> ...原创 2020-10-05 02:41:35 · 122 阅读 · 0 评论 -
poj2826
题意:给你两个线段填空垂直下雨问能接到的水的面积ans = 0.0:1.存在线段平行y轴2.两线段重合平行不相交2.一条线挡住另一条求S:点到直线的距离 *x / 2注:自己加的点虚构的坐标可能和原有的点撞上啊!加个一啊!答案最好加eps#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring...原创 2020-10-02 21:20:39 · 70 阅读 · 0 评论 -
POJ2074 视线相交
https://vjudge.net/contest/377085#problem/O普通的线线相交有一些细节#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring> using namespace std;const double eps = 1e-8;const double pi = acos(-1...原创 2020-10-02 13:37:40 · 213 阅读 · 0 评论 -
poj1696 卷包裹法 O(N H)求凸包
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int inf = 0x3f3f3f3f;const double eps = 1e-8;int t,n,ans[55];bool vis[55];struct Point{ double x,y;.原创 2020-10-01 13:55:54 · 109 阅读 · 0 评论 -
叉积判断线段/直线相交 POJ3304
题意:给你n个线段的两端坐标问是否存在一条直线所有线段在这条直线上的投影有共同点思路存在一条直线所有线段在这条直线上的投影有共同点 ==有一条线能穿过所有线段(这两条直线刚好⊥)暴力枚举所有端点 直线与线段相交——叉积(判断一次就够啦~/线段与线段相交twice)ACcode#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>...原创 2020-07-09 23:39:50 · 164 阅读 · 0 评论 -
点,线,面,形、点积叉积 模板
运算符重载struct point{ int x,y; point(int x = 0,int y = 0):x(x),y(y){}};typedef point vector;vector operator +(vector a,vector b){ return vector(a.x + b.x,a.y + b.y);}vector operator -(point a,point b){ return vector(a.x-b.x,a.y-b.y);}vector ope原创 2020-09-03 23:27:42 · 504 阅读 · 0 评论