SHOI2009 Booking 會場預約

2022-05-19 10:05:38 字數 1107 閱讀 7540

題目:洛谷p2161。

題目大意:有一些操作,分為兩種:

a.增加乙個從第l天到第r天的預約,並刪除與這個預約衝突的其他預約,輸出刪除了多少個預約。

b.輸出當前有效預約個數。

兩個預約衝突定義為兩個預約有公共的日期。

解題思路:本題可以用stl巧妙解決。

首先要知道,stl中的lower_bound返回範圍內第乙個大於等於要查詢的值的指標。

以下用區間來表示預約,[l,r]就表示第l天到第r天的預約。

首先建立結構體,l和r表示區間的左端點和右端點。

用set儲存每個區間,比較方法為:按照r為第一關鍵字,小的在前,然後按照l為第二關鍵字,大的在前。

然後對於每個a操作,我們在set裡用lower_bound查詢[0,l],返回的其實是原有區間中,右端點最小的,且大於等於當前區間左端點的乙個區間。

然後比較一下查到的區間的左端點是否小於當前區間的右端點。

如果是,則刪除這個區間,答案+1,並重複這個過程。

否則,因為查詢到的區間嚴格大於當前區間(即沒有衝突,且l和r都大於當前的l和r),那麼下乙個區間就嚴格大於查詢到的區間,而當前區間的左端點大於上乙個區間的右端點(或沒有上乙個區間),所以沒有剩下的衝突了,結束查詢,插入當前區間並輸出答案。

對於b操作,只需輸出set的size即可。

時間複雜度

$o(n\log^2 n)$

。另外set自帶lower_bound,範圍預設為整個容器。

c++ code:

#include#include#include#includeusing namespace std;

struct hy

int main());

while(it!=s.end()&&r>=it->l));

}printf("%d\n",ans);

s.insert((hy));

}else printf("%u\n",s.size());

} return 0;

}

好像在洛谷上跑了rank1耶!

SHOI2009 會場預約

首先我們要知道,滿足什麼性質的線段,才與當前這個插入的線段有交集呢?那就是 線段的左端點在 1,r 但是線段的右端點大於l,所以,我們直接把線段的左端點當成下標,值當成r,插入到線段樹當中即可。然後刪除操作 只要在區間 1,r 並且區間max大於等於當前插入的線段的左端點,那麼就去刪除即可。同時線段...

SHOI2009 會場預約

題意 支援操作 按順序在數軸上插入一條線段,刪除並詢問所有與這條線段有交的線段個數。詢問當前數軸上一共有多少條線段。想做了很久的題 觀察到和線段 l i,r i 有交的線段,實際上就是右端點 ge l i 並且左端點 le r i 的一些線段。我們可以把所有線段按照右端點第一關鍵字,左端點第二關鍵字...

SHOI2009 會場預約

orz 據說這個題有四種寫法 我孔乙己表示只會一種。暫時的 pp大廈有一間空的禮堂,可以為企業或者單位提供會議場地。這些會議中的大多數都需要連續幾天的時間 個別的可能只需要一天 不過場地只有乙個,所以不同的會議的時間申請不能夠衝突。也就是說,前乙個會議的結束日期必須在後乙個會議的開始日期之前。所以,...