首先可以發現卡在隊伍最前面的人需要的包子數是嚴格遞增的
你如果比他少的話你會被他卡在隊伍中等隊首買到他要的包子數
隊伍所需包子數可以用 priority_queue 維護
同時計算目前發了多少包子
假設 wait (買到包子但在等隊首離開), leave(買到包子且離開了)
ans = wait-leave
拿到所需的包子的人就計算 wait + 1
當隊首拿到所需包子以後,會有一大票的人會離開,人數則是當前隊首和下一個隊首的中間的人數, 因為中間人所需包子數一定小於當前隊首,所以當隊首買到包子以後後面的人會一起離開,你只要記錄隊首們買包子的順序就可以算出中間有多少人!
還有一點 假設現在已經發了 10 個包子 ,新來一個人要求買5個包子,那你可以視為他要15個包子,這樣處理包子數就比較簡單了
用了一個queue 放隊首們, 一個priority_queue 中間人要買的包子的數
time complexity: O(q log q)
補充例子
e.g. 排隊的人要買的包子數 [5, 2, 3, 2, 8, 1 ,2, 11]
排序的q =[1, 2, 2, 2, 3] (隊首不需要考慮 因為買到包子就跑了)
當你發了2個包子以後 把<=2的處理掉
排序的q =[3] 目前 wait = 4, leave=0
當你發到5個包子以後
排序的q =[] , wait = 5, leave=0
但因為隊首(5) 離開了
我們知道下一個隊首(8)是第5個人買的 也就是說 中間有 5-1-1 =3個人
leave=3, 因此目前只剩 wait-leave=5-3=2個人在等
這樣就可以一直維護 wait, leave的值
複雜度 insert = log(size), pop=constant