HDU 3308 LCIS 線段樹區間合併

2022-06-01 01:06:10 字數 2396 閱讀 1546

題意:

給定n個整數。 你有兩種操作: u a b:用b替換第a個數。(編號從0開始) q a b:輸出[a,b]中最長連續嚴格遞增子串行(lcis)的長度。

第一行有乙個整數t,表示資料組數。

每組資料以兩個整數n,m(0 接下來的m行每行表示乙個操作:

u a b(0 <= a,n,0 <= b = 100000)

或q a b(0 <= a <= b 對於每個詢問,輸出答案。

思路:

結點修改以及區間查詢,我們很容易想到線段樹去實現。同時要求 lcis 我們會想到線段樹儲存區間最大值的操作。但是關鍵在於區間如何去更新。

當左右兩個子樹區間向上合併的時候,父親區間的最大值應該怎麼更新。

進行分類討論:

(1)合併時中間部分不會連線:左右區間合併時由於 左子樹的右端值大於等於右子樹的左端值,所以中間部分不能連線 (這樣該區間最大值就等於 左右子樹區間的最大值)

(2)如果要進行連線:

(i)判斷是否更新 合併區間左右端連續長度,由於中間連線,所以如果左子樹左端連續長度等於其區間長度,(即整個區間連續)則需要更新 合併區間左端長度 = 左子樹左端連續長度+右子樹左端連續長度

同理,合併區間右端長度 = 左子樹右端連續長度+右子樹右端連續長度

(ii) 最後再次判斷是否更新區間最長

code:其他具題見**註解

#include using

namespace

std;

typedef

long

long

ll;typedef unsigned

long

long

ull;

typedef pair

pii;

const

double pi = acos(-1.0

);const

double esp = 1e-9

;const

int inf = 0x3f3f3f3f

;const

int maxn = 5e5+7

;const

int maxm = 1e6+7

;const

int mod = 1e9+7;//

區間合併問題

//要求得區間最長lcs,利用線段樹及兩兩拆分

//合併後的最長長度為記錄,左最長連續,右最長連續,和中間合併後的最長連續

intn,m;

struct

segmenttree

}void build(int l,int r,int

p)

int mid = (l+r)>>1

; build(l,mid,p

<<1

); build(mid+1,r,p<<1|1

); push_up(p);

}void push_up(int

p)

//(2**)如果右子樹lcis等於其區間長度

if(rmax[p<<1|1] == (r[p<<1|1]-l[p<<1|1]+1

))

//(3)判斷最大長度是否更新:左子樹的右端與右子樹的左端

maxlen[p] = max(maxlen[p],rmax[p<<1] + lmax[p<<1|1

]); }

} void update(int p,int k,int

q)

int mid = (l[p]+r[p])>>1

;

if(q<=mid) update(p<<1

,k,q);

else update(p<<1|1

,k,q);

push_up(p);

}int query(int ql,int qr,int

p)

int mid = (l[p]+r[p])>>1

;

int res = 0

;

if(ql<=mid) res = max(res,query(ql,qr,p<<1

));

if(qr>mid) res = max(res,query(ql,qr,p<<1|1

));

//(中間區間長度)

if(rs[p<<1]1|1

])

return

res;

}}seg;

intmain()

else}}

return0;

}

HDU 3308 LCIS(線段樹合併)

維護乙個區間的包含最左的元素的lcis,包含最右元素的lcis,以及整個區間的lcis,然後pushup的時候就更新這三個值就行了。注意要考慮左右兒子可以 接 起來的情況等等 查詢的時候要注意,也要考慮左右可以 接 起來時候,不過還要注意,有可能左右兒子邊界的已經 越界了 就是超過了查詢範圍,還要取...

HDU 3308 LCIS(線段樹區間合併)

給你乙個序列,現在進行一些操作,一種是詢問某一段最長連續上公升子串行 lcis 的長度,另乙個就是修改某個點的值 區間合併的簡單題 這裡的區間合併,要判斷的是左兒子最右邊的值和右兒子最左邊的值的關係,那麼我們這道題要維護的東西就有 最左端開始的lcis,包括最右端的lcis,該區間的lcis,最左邊...

HDU 3308 LCIS 線段樹 區間合併

題目鏈結 前言 最近在做線段樹的練習,對於區間合併問題不是很清楚,花了好久才把線段樹的區間合併問題理清楚,所以把學習的過程記錄下來,建議手動建樹並模擬測試用例 題目大意 有乙個陣列,求這個陣列中最長的單調連續遞增序列的長度 題解 見一下注釋 樹結點的定義 有該結點的左端點 右端點 有該結點對應區間的...