【問題描述】
在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。
面對海量租借教室的信息,我們自然希望編程解決這個問題。
我們需要處理接下來n天的借教室信息,其中第i天學校有ri個教室可供租借。共有m份訂單,每份訂單用三個正整數描述,分別為dj, sj, tj ,表示某租借者需要從第sj 天到第tj 天租借教室(包括第sj天和第tj天),每天需要租借dj個教室。
我們假定,租借者對教室的大小、地點沒有要求。即對于每份訂單,我們只需要每天提供dj個教室,而它們具體是哪些教室,每天是否是相同的教室則不用考慮。
借教室的原則是先到先得,也就是說我們要按照訂單的先后順序依次為每份訂單分配教室。如果在分配的過程中遇到一份訂單無法完全滿足,則需要停止教室的分配,通知當前申請人修改訂單。這里的無法滿足指從第sj天到第tj天中有至少一天剩余的教室數量不足dj個。
現在我們需要知道,是否會有訂單無法完全滿足。如果有,需要通知哪一個申請人修改訂單。
【解】
這道題我們需要用到二分法和前綴和。對于每一份訂單,我們有三個數s,t,d我們用一個數組sum儲存前綴和。假如有五天,一開始sum數組為【0,0,0,0,0】當s=2,t=4,d=2時。我們做這樣的操作sum[s]+=d;sum[t+1]-=d;這樣sum就變為了【0,2,0,0,-2】然后我們求前綴和sum就變為了【0,2,2,2,0】我們就完成了對第二天到第四天需要借用兩個教室的記錄。想到這里,后面我們只需要利用二分法,二分前幾個訂單,然后我們check一下,看對于前x個訂單是否每天的教室都夠用,最后就能二分得到答案了。ps:此題也可以用線段樹解決,但要使用lazy標記。