題目鏈結
發現這道題可以用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大廈有一間空的禮堂,可以為企業或者單位提供會議場地。這些會議中的大多數都需要連續幾天的時間 個別的可能只需要一天 不過場地只有乙個,所以不同的會議的時間申請不能夠衝突。也就是說,前乙個會議的結束日期必須在後乙個會議的開始日期之前。所以,...