線段樹維護連續區間

2022-06-08 22:09:15 字數 2503 閱讀 5427

在抗日戰爭期間,華北平原廣大地區進行了大規模的隧道戰。 一般來說,通過隧道連線的村莊排成一列。 除了兩端,每個村莊都與兩個相鄰的村莊直接相連。

入侵者經常對一些村莊發動襲擊並摧毀其中的部分隧道。 八路軍指揮官要求最新的隧道和村莊連線狀態。 如果某些村莊嚴重隔離,必須立即恢復連線!

input

輸入的第一行包含兩個正整數n和m(n,m≤50,000),表示村莊和事件的數量。 接下來的m行中的每一行描述乙個事件。

以下所示的不同格式描述了三種不同的事件:

d x:第x個村莊被毀。

r:最後毀壞的村莊被重建了。

output

按順序輸出每個指揮官詢問的答案。
sample input

7 9

d 3d 6

d 5q 4

q 5r

q 4r

q 4

sample output

102

4

sponsor

傳送門

定義線段樹:

ll 記錄區間左端點開始的最大連續個數,  rr 記錄區間右端點開始的最大的連續個數,

ml表示該區間最大的連續點的個數。

struct

nodet[maxn];

建樹:

void build(int p,int l,int

r)

int mid=(t[p].l+t[p].r)/2

; build(p*2

,l,mid);

build(p*2+1,mid+1

,r);

}

更新:

void update(int p,int x,int

val)

if(x<=t[2*p].r)

else

//更新正個區間

t[p].ml=max(t[2*p].ml,t[2*p+1].ml);//

可能有斷層l---1 1--mid ,mid----1 1-----r

t[p].ml=max(t[p].ml,t[2*p].rr+t[2*p+1].ll);//

左區間最右,和右區間的最左

//更新左區間

t[p].ll=t[2*p].ll;

if(t[p].ll==t[2*p].r-t[2*p].l+1)

t[p].rr=t[2*p+1

].rr;

if(t[p].rr==(t[2*p+1].r-t[2*p+1].l+1

))

}

查詢:

int query(int p,int x)

if(x<=t[2*p].r)

else

}else

else

}}

#include#include

using

namespace

std;

const

int maxn=1e6+100

;int

top;

intq[maxn];

struct

nodet[maxn];

void build(int p,int l,int

r)

int mid=(t[p].l+t[p].r)/2

; build(p*2

,l,mid);

build(p*2+1,mid+1

,r);

} void update(int p,int x,int

val)

if(x<=t[2*p].r)

else

//更新正個區間

t[p].ml=max(t[2*p].ml,t[2*p+1].ml);//

可能有斷層l---1 1--mid ,mid----1 1-----r

t[p].ml=max(t[p].ml,t[2*p].rr+t[2*p+1].ll);//

左區間最右,和右區間的最左

//更新左區間

t[p].ll=t[2*p].ll;

if(t[p].ll==t[2*p].r-t[2*p].l+1)

t[p].rr=t[2*p+1

].rr;

if(t[p].rr==(t[2*p+1].r-t[2*p+1].l+1

))

}int query(int p,int x)

if(x<=t[2*p].r)

else

}else

else

}}int

main()

else

if(str[0]=='q'

)

else}}

}

hdu1540(線段樹維護連續區間模型)

translation 打地道戰,n個村莊用地道連成一條直線,鬼子有時破壞掉乙個村莊,這時八路軍要修好這個據點。現在要求詢問任意乙個村莊,得出這個村莊現在與幾個村莊相連,包括它本身。solution 線段樹維護連續子區間 將村莊抽象成乙個點,正常下值為1,被破壞後變成0,即可將題目抽象成乙個求目標節...

線段樹區間合併 連續區間問題

hdu 1540 資料很奇葩。用討論區裡面的話形容這題很合適 九九八十一難,這道題比北大的資料真是坑出翔來了 poj 2892 原題 一摸一樣 題意 給定n個村莊排成一行,它們相鄰的村莊通過地道相連,有三種操作 1 炸毀第x個村莊 2 修復上乙個被炸毀的村莊 3 詢問 輸出 第x個村莊還能和幾個村莊...

線段樹3(離散化,連續區間)

題目是依次按給定的範圍貼海報,問覆蓋到最後還能看到幾張海報。因為給定的貼海報的板子總長度為10 9,陣列開不下。但是考慮到海報只有10 5張,而整個問題其實課忽略板子長度,只需要考慮每張海報之間的覆蓋關係就可以了,也就是說 1,1000008 3,9990 10,20000000 這三個區間的覆蓋情...