题意:
n(10^5)个模板形成的栅栏 q(10^5)个询问 每个询问要求在[u,v]木板区间内摆放一个宽度为w的矩形 问矩形最大的高是多少
思路:
对于每个询问 可以通过logn的二分来将求解最大h的问题转化为当前h‘情况下的判定问题
为什么可以二分呢 因为如果我们将木板排序 从大到小的依次放置它们的位置上 那么对于某一时刻 线段上连续的1就代表了矩形的宽 同时这时的h最小为二分到的木板高度h’ 明显h‘和这时矩形的宽满足单调性
得到了h’后只需要快速的找出[u,v]区间连续的1的长度是否超过w就好了 这就需要我们提供一种能“追溯到过去任何时刻”的数据结构 而且这个数据结构能在log时间内回答上述问题 明显可持久化线段树满足要求
那么我们可以nlogn的建树 然后二分h 再通过可持久化线段树询问区间内最长的连续的1长度是否超过w 这样对于询问的处理就是m(logn)^2的了
代码:
#include
#include
#include
#include
#include
#include