CF702F T-Shirts 解题报告
先将所有 T-shirts 按照品质和价格排序,接下来问题变为
做法 1,离线 O(n\log n\log w)
考虑离线,将所有人按拥有的钱升序排序,依次枚举所有 T-shirts,买了这件 T-shirt 的人一定是一个后缀,买了这件 T-shirt 的人可能会因为钱变少而发生了人之间顺序的改变,我们把这个改变的形态写出来:
-
所有
b \in [0,c) ,不改变。 -
所有
b \in [c,+\infty) ,b\gets b-c 。
两个人钱之间相对顺序的改变仅当一个人在
使用平衡树维护所有人之间的钱的顺序,每次将平衡树分成三部分,
时间复杂度
做法 2,在线 O(n\log n\log w)
对于大于
如果在继续枚举
-
出现了一个层比
E 更低的c_i 满足b<c_i 。 -
出现了一个层也为
E 的c_i 满足b\geq c_i 。
前者显然成立,后者因为
出去这两种情况,就只剩下出现了一个层级更低切
对于目前的位置
因为在经过了
使用线段树维护区间内低于每个层级的
同时也维护每个层级内不会减去一个同层的
在维护这些信息后容易把该二分丢到线段树上,调整信息合并的方式后也可以选择直接 ST 表二分,但是 ST 表二分的空间 2log 的,不太可取。
信息合并的方式与二分的过程可能有些细节,可以参考我的代码。
该做法时间复杂度
这种值域分层的思想将在 CF1515I、P8522 中得到更进一步的运用。
做法 3,在线 O(n(\log n+\log w))
该做法由李欣隆老师在 WC2024 时讲述。
考虑直接回归最朴素的暴力,就直接
也就是说对于
*:其实就是路径复制,像正常地平衡树拼接序列一样,复制自己的之后将合并路径上的节点复制作为新的,没有改变的儿子继续指向原本的即可。