NOIP 2012 借教室 括號法

2021-07-24 04:42:14 字數 2483 閱讀 6066

codevs

題目描述 description

在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要

向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。

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

我們需要處理接下來n天的借教室資訊,其中第i天學校有ri個教室可供租借。共有m份

訂單,每份訂單用三個正整數描述,分別為dj, sj, tj,表示某租借者需要從第sj天到第tj天租

借教室(包括第sj天和第tj天),每天需要租借dj個教室。

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

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

借教室的原則是先到先得,也就是說我們要按照訂單的先後順序依次為每份訂單分配教

室。如果在分配的過程中遇到乙份訂單無法完全滿足,則需要停止教室的分配,通知當前申

請人修改訂單。這裡的無法滿足指從第sj天到第tj天中有至少一天剩餘的教室數量不足dj個。

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

訂單。

輸入描述 input description

第一行包含兩個正整數n, m,表示天數和訂單的數量。

第二行包含n個正整數,其中第i個數為ri,表示第i天可用於租借的教室數量。

接下來有m行,每行包含三個正整數dj, sj, tj,表示租借的數量,租借開始、結束分別在

第幾天。

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

輸出描述 output description

如果所有訂單均可滿足,則輸出只有一行,包含乙個整數 0。否則(訂單無法完全滿足)

輸出兩行,第一行輸出乙個負整數-1,第二行輸出需要修改訂單的申請人編號。

樣例輸入 sample input

4 3 

2 5 4 3

2 1 3

3 2 4

4 2 4

樣例輸出 sample output

-1

2

資料範圍及提示 data size & hint

【輸入輸出樣例說明】

classroom.out

-1 2

第 1 份訂單滿足後,4 天剩餘的教室數分別為 0,3,2,3。第 2 份訂單要求第 2 天到

第 4 天每天提供 3 個教室,而第 3 天剩餘的教室數為 2,因此無法滿足。分配停止,通知第

2 個申請人修改訂單。

【資料範圍】

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

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

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

對於 100%的資料,有1 ≤ n, m ≤ 10^6, 0 ≤ ri, dj≤ 10^9, 1 ≤ sj≤ tj≤ n。

題解:

首先肯定是二分,對可以滿足的區間二分o(logn),然後我們只要在o(n)時間複雜度判定是否可行,那麼時間複雜度就是o(nlogn),這個題目就沒什麼問題了,我們現在只要在o(n)的時間複雜度判定是否可行,陳老師交給我乙個括號法,大致是這樣的,將每份訂單分為左端點和右端點,然後分別記錄這個訂單的大小,這樣的話我們就可以最後從1-n迴圈統計到每個點的訂單數量,碰到為左端點且不為零就加上,碰到前乙個右端點就減去。

然後思考發現其實我們可以把左右端點合併只是要把右端點變成負的。嗯,節省了一點空間,而且因為最後賦值少了幾個賦值為0,所以跑得快很多了。

#include 

#include

const

int maxn = 2000005;

using

namespace

std;

int d[maxn],l[maxn],r[maxn],s[maxn],q[maxn];

int n,m,sum,ans;

inline

int read()

while('0'

<= ch&&ch <= '9')

return x;

}inline

void init()

inline

bool check(int m)

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

return

true;

}int main()

if(!ans) printf("0");

else

printf("-1\n%d",ans);

return

0;}

noip2012 借教室 題解

emm,根據題意描述,就是每次區間加乙個數,問是否滿足條件。首先,答案肯定滿足二分性質,之後就是判斷了。說白了就是很多次區間加,然後一次查詢前面各個數。當然,線段樹,樹狀陣列裸題,但是,這樣是nlogn的,過不了呀。要重新考慮。由於只查詢一次,我們可以差分陣列,每次修改是o 1 的,查詢是o n 的...

NOIP 2012 借教室 線段樹

水題,但是裸的線段樹複雜度太高,要用帶標記的線段樹,第一次寫這種題,也算來打個備忘。每訪問到乙個結點就先傳一下標記,然後每次修改某個點的標記時再傳一下標記。不過我各種常數優化都試過可怎麼就第20個點還超15ms 難不成是蒟蒻光環專屬特效?include include include using n...

NOIP2012提高組 借教室

這個題目是個一眼題啊,維護一下一段區間內教室數的最小值,線段樹搞就可以了,lazy標記打一打,來乙個訂單先詢問再區間減,codevs上是可以過的,只不過嘛。debug大神。include include include include includeconst int maxn 1e6,maxnod...