SH0I 2009 會場預約

2021-08-05 18:23:53 字數 1690 閱讀 2858

題目鏈結

發現這道題可以用stl做,就犯了懶,學了學set的用法,不得不佩服c++的發明者啊

首先先感謝這位博主

set,顧名思義,就是數學上的集合——每個元素最多隻出現一次,並且set中的元素已經從小到大排好序。

標頭檔案:#include < set >

常用操作:

begin()   返回set容器的第乙個元素的位址

end()    返回set容器的最後乙個元素位址

clear()    刪除set容器中的所有的元素

empty()   判斷set容器是否為空

max_size() 返回set容器可能包含的元素最大個數

size()     返回當前set容器中的元素個數

erase(it) 刪除迭代器指標it處元素

insert(a) 插入某個元素

有了這個,便可以很容易的處理這道題目了,我們利用lower_bound尋找比當前插入元素的l大的r,即為不合法的元素,刪去,依次處理就行了

細節:這個元素l&&r《查詢出來的l,仍然是沒有重疊的,即元素合法

需要注意的是end返回的是乙個越界的位址,與lower_bound相似

#include 

#include

#include

using

namespace

std;

struct node);

if(it!=s.end()&&r>=it->lf)//注意細節處理

break;

}s.insert((node));//插入新元素

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

}else

printf("%d\n",s.size());//輸出set容器中元素的個數

}return

0;}

#include 

#include

#include

using

namespace

std;

int cnt[300001];

int st[300001*4];

int m[300001*4];

struct wea[200100];

inline

void push_down(int o)

void query(int o,int l,int r,int ql,int qr,int sum)

if(m[o]!=m[0])

push_down(o);

int mid=(l+r)>>1;

if(ql<=mid) query((o<<1),l,mid,ql,qr,sum);

if(mid+1

<=qr) query((o<<1)+1,mid+1,r,ql,qr,sum);

st[o]=min(st[(o<<1)],st[(o<<1)|1]);

}int ask(int o,int l,int r,int ql,int qr)

int main()

for(int i=n;i>=1;i--)

}int ans=0;

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

else

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

}return

0;}

SHOI2009 會場預約

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

SHOI2009 會場預約

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

SHOI2009 會場預約

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