首先我們要知道,滿足什麼性質的線段,才與當前這個插入的線段有交集呢?
那就是:線段的左端點在[1,r],但是線段的右端點大於l,所以,我們直接把線段的左端點當成下標,值當成r,插入到線段樹當中即可。然後刪除操作:只要在區間[1,r],並且區間max大於等於當前插入的線段的左端點,那麼就去刪除即可。
同時線段樹維護一下元素個數。
ac**:
#pragma gcc optimize("-ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const
int n=
1e5+10;
int n,m=
1e5,mx[n<<2]
,sum[n<<2]
,s;char op[5]
;inline
void
push_up
(int p)
void
change
(int p,
int l,
int r,
int x,
int v)
int mid=l+r>>1;
if(x<=mid)
change
(p<<
1,l,mid,x,v)
;else
change
(p<<1|
1,mid+
1,r,x,v)
;push_up
(p);
}void
del(
int p,
int l,
int r,
int ql,
int qr,
int v)
int mid=l+r>>1;
if(qr<=mid)
del(p<<
1,l,mid,ql,qr,v)
;else
if(ql>mid)
del(p<<1|
1,mid+
1,r,ql,qr,v)
;else
del(p<<
1,l,mid,ql,mid,v)
,del
(p<<1|
1,mid+
1,r,mid+
1,qr,v)
;push_up
(p);
}signed
main()
else
printf
("%d\n"
,sum[1]
);}return0;
}
SHOI2009 會場預約
題意 支援操作 按順序在數軸上插入一條線段,刪除並詢問所有與這條線段有交的線段個數。詢問當前數軸上一共有多少條線段。想做了很久的題 觀察到和線段 l i,r i 有交的線段,實際上就是右端點 ge l i 並且左端點 le r i 的一些線段。我們可以把所有線段按照右端點第一關鍵字,左端點第二關鍵字...
SHOI2009 會場預約
orz 據說這個題有四種寫法 我孔乙己表示只會一種。暫時的 pp大廈有一間空的禮堂,可以為企業或者單位提供會議場地。這些會議中的大多數都需要連續幾天的時間 個別的可能只需要一天 不過場地只有乙個,所以不同的會議的時間申請不能夠衝突。也就是說,前乙個會議的結束日期必須在後乙個會議的開始日期之前。所以,...
SHOI2009 會場預約 線段樹
pp大廈有一間空的禮堂,可以為企業或者單位提供會議場地。這些會議中的大多數都需要連續幾天的時間 個別的可能只需要一天 不過場地只有乙個,所以不同的會議的時間申請不能夠衝突。也就是說,前乙個會議的結束日期必須在後乙個會議的開始日期之前。所以,如果要接受乙個新的場地預約申請,就必須拒絕掉與這個申請相衝突...