Back to Leetcode

Readme

Segment_Tree/2286.Booking-Concert-Tickets-in-Groups/Readme.md

latest1.5 KB
Original Source

2286.Booking-Concert-Tickets-in-Groups

根据题意,我们需要给维护一个数组seats,代表每一行剩余的座椅数目。

如果遇到的是scatter,那么我们就从前往后查看每一行,有任何剩余的座位就都分配出去。如果某一行的座位都已经被scatter分配完了,那么这意味着该行及其之前的行都没有空座了,今后可以忽略。所以我们需要一个指针p,来指向当前仍有作为剩余的最小行号。但是这里有一个问题,如果对于某个scatter query,我们试图一行一行地去查询和分配座位后,发现无法满足要求(所有分配的座位必须在指定的maxRow之前)。于是我们需要有一个函数,支持查看[0,maxRow]这个区间内还剩多少个座位。如果查询得知剩余座位不够,就可以直接返回false。如果查询得知剩余座位足够,我们再逐行更新seats[p],将分配完所有座位的行号都置零。显然,这是区间求和,这需要一个选段树或者BIT的数据结构。

如果遇到的是gather,那么我们就需要找到最小的行号i,满足seats[i]>=k.那么如何高效地实现这个功能呢?也是用线段树。我们需要一个函数,支持查询[0,row]这个区间内的最大值。我们可以通过二分法,快速查到满足条件的最小的row。那么我们就可以更新seats[row]-=k.

所以,我们需要利用两种线段树的模板,分别实现查询rangeSum和rangeMax的功能。当然,也要支持节点数值的动态修改。