dispatching:
我们可以使用一个大根堆保存一个子树中的所有点,同时维护节点个数和点权和。不断删除最大值使和小于m,这样就是一个方案。再把子树合并到父节点的堆中,用左偏树可以做到O(log n)。
guard:
我们把报告无人的区间都删去,再把完全包含其他子区间的区间也可删去(因为它们一定可以满足)。之后再离散化、排序。记F(i)为满足1-i号区间(排序后的)限制的最少的忍者数,G(i)为满足i-n的忍者数,这可以用贪心求出(每次选未被满足的第一个区间的最右端)。这里我们也可以发现,只有一个区间的右端点才一定有人。这样我们枚举每个区间,若长度为一则一定要取;若长度不为一,则尝试右端点左边一个可否放人,设此处与i-j号区间相交,若F(i-1)+G(j+1)+1=ANS就可以放。最后还有若可能的位置与忍者数相等,就应全部都放。
kunai:
太神了!