洛谷 P1083 借教室 二分 差分陣列

2021-09-02 18:53:24 字數 2992 閱讀 2726

在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。

面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。

我們需要處理接下來n

nn天的借教室資訊,其中第i

ii天學校有r

ir_i

ri​個教室可供租借。共有m

mm份訂單,每份訂單用三個正整數描述,分別為dj,

sj,t

jd_j,s_j,t_j

dj​,sj

​,tj

​,表示某租借者需要從第s

js_j

sj​天到第t

jt_j

tj​天租借教室(包括第s

js_j

sj​天和第t

jt_j

tj​天),每天需要租借d

jd_j

dj​個教室。

我們假定,租借者對教室的大小、地點沒有要求。即對於每份訂單,我們只需要每天提供d

jd_j

dj​個教室,而它們具體是哪些教室,每天是否是相同的教室則不用考慮。

借教室的原則是先到先得,也就是說我們要按照訂單的先後順序依次為每份訂單分配教室。如果在分配的過程中遇到乙份訂單無法完全滿足,則需要停止教室的分配,通知當前申請人修改訂單。這裡的無法滿足指從第s

js_j

sj​天到第t

jt_j

tj​天中有至少一天剩餘的教室數量不足d

jd_j

dj​個。

現在我們需要知道,是否會有訂單無法完全滿足。如果有,需要通知哪乙個申請人修改訂單。

第一行包含兩個正整數n,m

n,mn,

m,表示天數和訂單的數量。

第二行包含n

nn個正整數,其中第i

ii個數為r

ir_i

ri​,表示第i

ii天可用於租借的教室數量。

接下來有m

mm行,每行包含三個正整數dj,

sj,t

jd_j,s_j,t_j

dj​,sj

​,tj

​,表示租借的數量,租借開始、結束分別在第幾天。

每行相鄰的兩個數之間均用乙個空格隔開。天數與訂單均用從1

11開始的整數編號。

對於10%的資料,有1≤n

,m≤10

1≤ n,m≤ 10

1≤n,m≤

10;對於30%的資料,有1≤n

,m

≤1000

1≤ n,m≤1000

1≤n,m≤

1000

;對於 70%的資料,有1≤n

,m≤1

05

1 ≤ n,m ≤ 10^5

1≤n,m≤

105;

對於 100%的資料,有1≤n

,m≤1

06,0

≤ri,

dj≤1

09,1

≤sj≤

tj≤n

1 ≤ n,m ≤ 10^6,0 ≤ r_i,d_j≤ 10^9,1 ≤ s_j≤ t_j≤ n

1≤n,m≤

106,

0≤ri

​,dj

​≤10

9,1≤

sj​≤

tj​≤

n。如果所有訂單均可滿足,則輸出只有一行,包含乙個整數 0

00。否則(訂單無法完全滿足)

輸出兩行,第一行輸出乙個負整數−1-1

−1,第二行輸出需要修改訂單的申請人編號。

4 32 5 4 3

2 1 3

3 2 4

4 2 4-12

第 1

11 份訂單滿足後,4

44 天剩餘的教室數分別為 0,3

,2,3

0,3,2,3

0,3,2,

3 。第 2

22 份訂單要求第 2

22 天到第 4

44 天每天提供 3

33 個教室,而第 3

33 天剩餘的教室數為 2

22,因此無法滿足。分配停止,通知第 2

22 個申請人修改訂單。

去打icpc徐州regional的時候有一道樹上差分+lca的題目,不會樹上差分,從差分陣列學起。

中文題目,題意很明確,可以直接從1~m中二分出答案,而二分的判斷函式需要用到差分陣列維護。

通過差分陣列進行o(1)的修改操作,最後o(n)處理判斷。

#include

using

namespace std;

const

int inf =

0x3f3f3f3f

;const

int maxn =

1e6+5;

int n, m;

int ans;

int r[maxn]

;int d[maxn]

, s[maxn]

, t[maxn]

;int difference[maxn]

;int sum[maxn]

;bool

check

(int x)

sum[0]

=0;for

(int i =

1; i <= n;

++i)

}return

true;}

intmain

(int argc,

char

*argv)

for(

int i =

1; i <= m;

++i)

int left =

1, right = m;

ans = inf;

while

(left <= right)

else}if

(ans == inf)

else

return0;

}

洛谷 P1083 借教室 (差分陣列 二分)

今天很偶然看到了乙個挺好的關於差分陣列的講解,之前打比賽也遇到過,只是沒有很系統的了解過這個神奇的東西。學完之後真的覺得這種思想真的是十分的巧妙,然後就做了一下講解裡的例題。include define int long long using namespace std const int maxn...

洛谷 P1083 借教室 二分 差分

題意 思路 首先可以看出這是乙個比較典型的差分,首先是離線,然後在區間l,r增加幾,這些都是差分的特徵,那麼現在問題就是,怎樣差分?我們可以看出天數是具有單調性的,當在第x天不行的時候那麼x 1肯定也不行,由此可以看出天數是具有二分的特性的,所以我們可以二分天數。include using name...

洛谷P1083 借教室 二分 差分

n天,每天有r i 個教室出租,一共m個訂單,按照先後順序,每個訂單從s天開始到t天結束,每天要借d個,如果所有訂單都能完成,輸出0,哪天教室不夠,輸出到那個訂單的單號。二分可以完成到第幾個訂單,對於每個二分的值,進行差分到這個訂單為止所有的天數,求下字首和,就可以得出對於每一天有沒有超出借出的教室...