从1到n的厕所。一个人可以在厕所预约,并在一定的时间间隔内使用。按照以下规则分配厕所进行预订。
对于给定的传入预订和离开序列,找到所分配的所有厕所序列号的总和。
输入:
测试用例的第一行T-否(1 <= T <= 10)
N个厕所,M个请求(1 <= N,M <= 20,000)
M行跟随两个整数
A为请求类型传入/传出预订,B人进行预订的人ID(如果A == 1然后进入预订,A = = 2在使用厕所后离开)
(1&lt; = A&lt; = 2,1 =&lt; = B&lt; = 999999)
示例输入: 1 5 7 1 1 1 2 1 3 1 4 2 1 1 1 1 5 产量:16 说明:N = 5,M = 7.人员1分配到1号厕所,1号人员分配到3号厕所,1号人员分配到厕所号码1。 3,人id为4比2,然后人id 1离开厕所然后人id 1再次预约并分配1并且人Id 5被分配4。 所以最终答案是1 + 5 + 3 + 2 + 1 + 4 = 16.
我解决这个问题的方法是:创建一个(startRange,endRange,Distance)的最大堆,并从堆中弹出最大距离值。
if(startRange==1 || endRange==n) {
assignned accordingly
}else{
toilet no is avg = (startRange+endRange)/2
and pushed (startRange,avg-1,distance) and (avg+1,endRange,distance) into our heap
}
现在的问题是,如果有人离开厕所,那么如何更新我的堆以合并这些更改。 或者建议是否有其他算法来解决这个问题。