洛谷P1083 借教室 題解

2022-09-09 22:12:24 字數 1010 閱讀 4319

[noip2012 提高組] 借教室

這道題是幾周之前做到的一道題,本來不想講的,因為這道題也是用到了二分答案的方法,這類題目之前已經發布過兩篇題解了。但這道題還運用了差分陣列這個思想,所以我覺得還是值得講一講的。

首先,什麼是差分陣列呢?就是對於某乙個陣列,每兩個相鄰元素的差值組成的新的陣列。比如對於陣列 \(a[4]=[1,4,2,6]\) ,其差分陣列即為 \([0,3,-2,4]\) (首元素設為0方便解題)。

所以回到這道題,我們該如何獲取每天所需要的教室呢?暴力求解最壞複雜度高達 \(o(mn)\) ,這顯然是不行的,所以要用到差分陣列的思想。對於原陣列每個區間 \([s,t]\) 的所有元素都增加 \(d\) ,差分陣列 \(diff\) 是如何變化呢?很簡單

\[diff[s]+=d, diff[t+1]-=d

\]想一想是不是,除了這兩個元素其他值都是保持不變的。求出 \(diff\) 陣列後求出原陣列就很容易的,原陣列 \(need\) 的表示式即為

\[need[i]=need[i-1]+diff[i]

\]複雜度只有 \(o(m+n)\) 。然後再將每天的需求量與現有量比較,如果都滿足,則直接輸出 \(0\) ,否則運用二分答案,同樣運用差分陣列的方法找到第乙個無法滿足的訂單,即為所需答案。程式總的複雜度為 \(o((m+n)\cdot logm)\) 。

#include#includeusing namespace std;

int* rest, * need;

int diff[1000002];

int *d, *s, *t;

int n, m;

bool ifcan(int x)

for (int i = 1; i <= n; i++)

return 1;

}int main()

if (!ifcan(m))

cout << r;

} else

cout << 0;

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 借教室

更好的閱讀體驗 portal1 luogu portal2 libreoj portal3 vijos 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教室的資訊,我們自然希望程式...

洛谷 P1083 借教室

在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量租借教室的資訊,我們自然希望程式設計解決這個問題。我們需要處理接下來n天的借教室資訊,其中第i天學校有ri個教室可供租借。共有m份訂單,...