题解 P9120 [春季测试 2023] 密码锁
分四种情况考虑:
-
k=1
输出最大值减最小值。
-
k=2
注意到答案的上界为最大值减最小值,要想低于这个上界就必须让最大值与最小值不在同一行。
不妨令最大值
时间复杂度
-
k=3
现在除了最大值和最小值所在的行外又多出了一行。首先固定最大值在第一行,通过转锁的方式调整最小值所在的行号,对每个行号依次处理。
同样二分极差最大值
先将所有可选值排序,再通过双指针滑动窗口的方式依次枚举区间。设
时间复杂度
-
k=4
还是一样二分
我们放在二维平面上来考虑。设一种合法构造中第一维的最大值为
对于一个点
考虑使用扫描线转化为数轴问题,合法点集在扫描线上的投影就变成了若干个区间的并。注意正方形,也就是扫描线中的区间个数对于每一把锁是
具体而言,珂朵莉树维护的东西形如
最后用一棵线段树维护当前每个位置被多少的合法点集包含。这棵线段树需要支持区间加减和区间查询最大值。如果存在位置被所有锁的合法点集包含,那么就有解。
时间复杂度
- 细节问题
- 多测清空:注意我们开的是值域线段树,不能直接暴力清空,需要打一个清空标记。同样的,扫描线也是基于值域的,需要记录哪些位置有操作。
- 关于最大最小值:需要特判它们在同一把锁,或者最大值等于最小值(也就是所有数均相同)的情况。
- 关于转锁:注意二分时不要去转最大最小值所在的锁。
Code (10KB,慎点)