计算几何训练笔记

Luogu1452 旋转卡壳,注意判一下平行的情况,另外有个比较简介的求凸包方法,就不用分别求上凸壳和下凸壳再合起来了:

int is(point a,point b){return a.x==b.x?a.y<b.y:a.x<b.x;}
#define pd(A,B,C) (cross((C-B),(B-A))>0||(cross((C-B),(B-A))==0&&is(A,B)==is(B,C)))

sort(p+1,p+n+1,is);
int cnt=0,i;
for(i=1;i<=n;all[++cnt]=i++) while(cnt>1&&pd(p[all[cnt-1]],p[all[cnt]],p[i])) --cnt;
for(i=n-1;i;all[++cnt]=i--) while(cnt>1&&pd(p[all[cnt-1]],p[all[cnt]],p[i])) --cnt;--cnt;

all 存的就是凸包点的编号

然后旋转卡壳注意可以用面积判断点离线段距离的长短,然后每次统计答案需要 \(j\)\(j+1\) 的两个点都需要更新答案。

Luogu2924 考虑将任两个点之间连边,按照边的斜率(atan2(y,x))排序,这显然就是个 DAG,dp 一下即可

nowcoder 57364E 模拟退火,考虑正方形的边长实际上可以认为是旋转角度 \(rad\) 的函数,其中 \(rad\) 表示逆时针旋转 \(rad\) 之后,将正方形认为是水平竖直的,退火调参调吐了image
最后 eps 设到 1e-8,在最后还加了个爬山才过。

Aizu-CGL
把板子完善了一下。。

posted @ 2023-09-08 14:51  SkyRainWind  阅读(9)  评论(0编辑  收藏  举报