更好的閱讀體驗
portal1: luogu
portal2: libreoj
portal3: vijos
在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。
面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。我們需要處理接下來n天的借教室資訊,其中第\(i\)天學校有\(r_i\)個教室可供租借。共有m份訂單,每份訂單用三個正整數描述,分別為\(d_j, s_j, t_j\),表示某租借者需要從第\(s_j\)天到第\(t_j\)天租借教室(包括第\(s_j\)天和第\(t_j\)天),每天需要租借\(d_j\)個教室。
我們假定,租借者對教室的大小、地點沒有要求。即對於每份訂單,我們只需要每天提供\(d_j\)個教室,而它們具體是哪些教室,每天是否是相同的教室則不用考慮。
借教室的原則是先到先得,也就是說我們要按照訂單的先後順序依次為每份訂單分配教室。如果在分配的過程中遇到乙份訂單無法完全滿足,則需要停止教室的分配,通知當前申請人修改訂單。這裡的無法滿足指從第\(s_j\)天到第\(t_j\)天中有至少一天剩餘的教室數量不足\(d_j\)個。
現在我們需要知道,是否會有訂單無法完全滿足。如果有,需要通知哪乙個申請人修改訂單。
第一行包含兩個正整數\(n, m\),表示天數和訂單的數量。
第二行包含\(n\)個正整數,其中第\(i\)個數為\(r_i\),表示第\(i\)天可用於租借的教室數量。
接下來有\(m\)行,每行包含三個正整數\(d_j, s_j, t_j\),表示租借的數量,租借開始、結束分別在第幾天。
每行相鄰的兩個數之間均用乙個空格隔開。天數與訂單均用從\(1\)開始的整數編號。
如果所有訂單均可滿足,則輸出只有一行,包含乙個整數\(0\)。否則(訂單無法完全滿足)輸出兩行,第一行輸出乙個負整數\(-1\),第二行輸出需要修改訂單的申請人編號。
4 3
2 5 4 3
2 1 3
3 2 4
4 2 4
-1
2
對於\(10\%\)的資料,有\(1 \le n, m \le 10\);
對於\(30\%\)的資料,有\(1 \le n, m \le 1000\);
對於\(70\%\)的資料,有\(1 \le n, m \le 10^5\);
對於\(100\%\)的資料,有\(1 \le n, m \le 10^6, 0 \le r_i, d_j \le 10^9, 1 \le s_j \le t_j \le n\)。
這題可以二分答案,先判斷訂單能否完全滿足,然後開始二分。
判斷的過程可以用差分來解決,diff[i]
為差分陣列,在加入每乙個借用段時,我們只要把頭尾標記:在開頭增加需要的教室數,在結尾減去它所需要的教室數即可。
#include#include#include#include#includeusing namespace std;
const int maxn = 1000005;
int n, m, a[maxn], d[maxn], s[maxn], t[maxn], diff[maxn];
inline bool check(int x)
int need = 0;//表示在那一天所需的教室的數量
for (int i = 1; i <= n; i++)
return 1;
}int main()
int l = 1, r = m;
while (l < r)
printf("-1\n%d\n", l);
return 0;
}
洛谷 題解 P1083 借教室
1 n,m 10 6 第一反應 o nlogn 直接輸出 0 即可。不要問我怎麼知道輸出 0 可以拿 5 pts。保持微笑.jpeg 1 考慮暴力。按照題意列舉即可。核心偽 如下 定義 n,m 為 int 型變數 定義 r 為 int 型陣列,大小為 max n 讀入 n,m 讀入 r 陣列 定義 ...
洛谷P1083 借教室 題解
noip2012 提高組 借教室 這道題是幾周之前做到的一道題,本來不想講的,因為這道題也是用到了二分答案的方法,這類題目之前已經發布過兩篇題解了。但這道題還運用了差分陣列這個思想,所以我覺得還是值得講一講的。首先,什麼是差分陣列呢?就是對於某乙個陣列,每兩個相鄰元素的差值組成的新的陣列。比如對於陣...
洛谷 P1083 借教室
在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。我們需要處理接下來n天的借教室資訊,其中第i天學校有ri個教室可供租借。共有m份訂單,...