洛谷P2161 SHOI2009 會場預約

2022-02-27 07:00:03 字數 1762 閱讀 7585

pp大廈有一間空的禮堂,可以為企業或者單位提供會議場地。這些會議中的大多數都需要連續幾天的時間(個別的可能只需要一天),不過場地只有乙個,所以不同的會議的時間申請不能夠衝突。也就是說,前乙個會議的結束日期必須在後乙個會議的開始日期之前。所以,如果要接受乙個新的場地預約申請,就必須拒絕掉與這個申請相衝突的預約。 一般來說,如果pp大廈方面事先已經接受了乙個會場預約,例如從10日到15日,就不會在接受與之相衝突的預約,例如從12日到17日。不過,有時出於經濟利益,pp大廈方面有時會為了接受乙個新的會場預約,而拒絕掉乙個甚至幾個之前預訂的預約。 於是,禮堂管理員qq的筆記本上筆記本上經常記錄著這樣的資訊: 本題中為方便起見,所有的日期都用乙個整數表示。例如,如果乙個為期10天的會議從「90日」開始到「99日」,那麼下乙個會議最早只能在「100日」開始。 最近,這個業務的工作量與日俱增,禮堂的管理員qq希望參加shtsc的你替他設計一套計算機系統,方便他的工作。這個系統應當能執行下面兩個操作: a操作:有乙個新的預約是從「start日」到「end日」,並且拒絕掉所有與它相衝突的預約。執行這個操作的時候,你的系統應當返回為了這個新預約而拒絕掉的預約個數,以方便qq與自己的記錄相校對。 b操作:請你的系統返回當前的仍然有效的預約的總數。

輸入格式:

輸入檔案的第一行是乙個整數n,表示你的系統將接受的操作總數。 接下去n行每行表示乙個操作。每一行的格式為下面兩者之一: 「a start end」表示乙個a操作; 「b」表示乙個b操作。

輸出格式:

輸出檔案有n行,每行一次對應乙個輸入。表示你的系統對於該操作的返回值。

輸入樣例#1:

6a 10 15

a 17 19

a 12 17

a 90 99

a 11 12

b輸出樣例#1:00

2012

n< = 200000

1< = start end < = 100000

一句話題意:給出\(n\)個區間,每次插入乙個區間,刪除所有與這個區間相交的區間,並輸出刪除的區間的數量.或者每次查詢當前還有多少區間被保留.

題解:首先我們會發現,每個區間最多會被插入和刪除一次,所以我們可以暴力插入和刪除,只要我們能夠在\(o(1)\)或是\(o(log_2n)\)的時間內找到要刪除的區間.

然後我們來思考一下當前沒有被刪除的區間有什麼性質:顯然他們之間是互不相交的,也就是說,未被刪除的區間的左端點具有單調性,所以我們可以將未被刪除的區間加入一顆平衡樹來模擬,這裡我使用了\(vector\)來模擬平衡樹(反正挺快的).

#includeusing namespace std;

int n, size = 0;

struct line

bool operator < (const line &a) const

}temp;

vector ve;

vector ::iterator it;

void insert(line a)

int main(), cnt = 0;

while(1)

}it = lower_bound(ve.begin(), ve.end(), temp);

if(it != ve.begin())

}break;

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

insert(temp);

//for(int j=0;j事實告訴我們用好stl是多麼重要!!!

洛谷P2161 SHOI2009 會場預約

題目大意 有兩種操作 a l r 表示加入區間 l,r 並把與之衝突的區間刪除,輸出刪除的區間的個數,區間 a 於區間 b 衝突當且僅當 a cap b not varnothing b 輸出現在有幾個區間 題解 用 stl 的 set 定義區間 a卡點 無 c code include inclu...

洛谷2161 會場預約 題解

好吧,用stl水過了一道題。顯然,每一次進行修改之前的所有預約一定是沒有互相覆蓋的。我們用set保留所有的預約,這樣在詢問時只要輸出set的size就行了 對於每次的新預約,我們就先找到右端點大於該區間左端端點的區間,然後乙個乙個刪除矛盾的預約就行了 複雜度大概為o n logn 2 bzoj上這道...

題解 洛谷P2161 會場預約(線段樹)

先說一下這道題的解題思路,我們使用離線操作的做法。記錄讀入的資料,把開始結束日期存在結構體裡,並記錄是a操作還是b操作。開乙個陣列記錄染色情況 乙個cnt陣列記錄第幾個操作推掉了幾個預約,讀入後我們倒著迴圈進行查詢,如果讀入的是b就跳過,如果是a的話就將開始到結束日期的所有點染成當前序號的顏色。如果...