难度顺序基本递增
poj2318 TOYS
二分点与直线关系
poj2002 Squares
枚举正方形下底边的两个点,哈希判对应的另两个点是否存在
(注意找点的题需要哈希,
m
a
p
map
map存多个
l
o
g
log
log)
poj2653 Pick-up sticks
保证现存木棍数
≤
1000
\leq 1000
≤1000,直接暴力判线段相交即可
poj3304 Segments
问题等价于求是否存在一条直线与所有线段相交
可以证明直线必然过线段的两个端点,暴力枚举判断即可。
poj2074 Line of Sight
读错题了orz,实际上是求物业线上最长的一段能够看见整个房子的区间。
直接求出对于每条障碍的盲区,扫描线即可。
bzoj2823: [AHOI2012]信号塔
最小圆覆盖模板
bzoj1132 [POI2008]Tro
每次枚举三角形最左点,将其余点按到基点的极角大小升序排序(保证叉积面积为正,去掉绝对值)。三角形面积为
a
x
b
y
−
a
y
b
x
a_xb_y-a_yb_x
axby−aybx,分别记录后缀
x
,
y
x,y
x,y之和即可。
poj1066 Treasure Hunt
本来还以为要跑个最短路啥的(陷入思维误区,而且这样很难写),然而只需要枚举四面中点计算与终点连接的线段严格相交的墙数再取
m
i
n
min
min(因为有且仅有这些墙必须要穿过)。
bzoj1914[Usaco2010 OPen]Triangle Counting
正难则反,考虑枚举所有不过原点的三角形。
对于每一个不过原点的三角形,必然有且仅有一个顶点满足另外两个顶点都在该点到原点
(
0
,
0
)
(0,0)
(0,0)的连线右侧。
bzoj2300: [HAOI2011]防线修建
离线倒序转成动态维护上凸包问题
s
e
t
set
set按极角维护,若当前插入点在凸包外则二分到对应位置往两边删点重新构成凸包。
bzoj1249
s
e
t
set
set极角维护一下动态凸包即可。
bzoj1822: [JSOI2010]Frozen Nova 冷冻波
判断线段与圆相交,再套个最大流
poj2932 Coneology
扫描线
bzoj1027: [JSOI2007]合金
故舍去无用的第三维,将材料看做二维平面上的点,两个原材料可以合成的合金就是所有在以这两点为端点的线段上的点。也就是在
m
m
m个点中选最少的点构成凸包围住所有目标点。
n
2
n^2
n2枚举两点之间连边
(
i
,
j
)
(i,j)
(i,j),若所有目标点都在
i
,
j
i,j
i,j左侧,则边权为1,否则为
+
∞
+\infty
+∞。
floyd
\text{floyd}
floyd求最小环即可。
关键在于特判
n
=
m
=
1
n=m=1
n=m=1和直线的情况。
bzoj1069 最大土地面积
求出凸包后可以
O
(
n
)
O(n)
O(n)求解,分类讨论一下:
若凸包上只有
3
3
3个点,则
O
(
n
)
O(n)
O(n)枚举第四个点即可。
否则最大四边形必然由两组对踵点对构成,且对重点对之间是一一对应的,
O
(
n
)
O(n)
O(n)扫一遍即可。
SGU 198 Get Out!
将圆
p
p
p看做一个点,其它圆都加上圆
p
p
p的半径。
p
p
p不能穿过圆
i
,
j
i,j
i,j之间意味着圆
i
,
j
i,j
i,j相交,连一条边。若存在绕
p
p
p点的环路则无解。
将
i
→
j
i\to j
i→j的连边边权值设为有向角
i
p
j
ipj
ipj的值,问题转成了
s
p
f
a
spfa
spfa判负环。
codevs1302 小矮人
判断直线是否与凸包相交等价于判断直线是否在凸包的一对最远点之间。
找最远点的具体方法:二分找到第一个严格大于直线斜率的边,它的起点为一个最远点,再将直线斜率取反,二分找到第一个严格大于取反后斜率的边,它的起点为另一个最远点。
bzoj3707: 圈地
一道具有需要发现神奇性质并感性证明的题:
枚举一条线段的两个端点,旋转坐标轴将其作为
y
y
y轴后,只需要求
y
y
y轴左右侧最近的一个点。考虑优化旋转坐标每次求最近点的过程:将点按
x
x
x为第一关键字,
y
y
y为第二关键字升序排序,并处理出所有从排名小到排名大的点的连边,将
n
2
n^2
n2条边按斜率升序排序。
排序后,对于第一条边(斜率最小)
(
a
,
b
)
(a,b)
(a,b),它的两个端点在点排列中必然是相邻的两个点,而此时点排列即对应着将该边作为
y
y
y轴后所有点按
x
x
x坐标的降序顺序。则离端点最近的点就是排列中这两个点两侧的点。
转移到下一条边时,边的斜率增大相当于将坐标顺时针旋转,假设初始状态
a
a
a排名比
b
b
b小,则此时
b
b
b比
a
a
a离
y
y
y轴更近了,需要交换
a
,
b
a,b
a,b的顺序。又因为没有其它点对的斜率介于这两条边之间,则仅有
a
,
b
a,b
a,b相对顺序改变。
一篇比较具体的题解
p.s.存在三点共线时无法证明其正确性
trick和注意事项:
- 旋转坐标防止被卡
- 随机增量记得先把点 random \text{random} random_ shuffle \text{shuffle} shuffle