HDU 3308 LCIS(線段樹合併)

2022-05-04 09:15:07 字數 782 閱讀 7057

維護乙個區間的包含最左的元素的lcis,包含最右元素的lcis,以及整個區間的lcis,

然後pushup的時候就更新這三個值就行了。注意要考慮左右兒子可以「接」起來的情況等等

查詢的時候要注意,也要考慮左右可以「接」起來時候,不過還要注意,有可能左右兒子邊界的已經「越界了」,就是超過了查詢範圍,還要取個min,這道題坑就坑在這兒

#include#define n 100005

using namespace std;

int n,m,val[n];

struct node

tree[4*n];

inline void pushup(int now)

inline void update(int now,int pos)

int m=(tree[now].l+tree[now].r)>>1;

if(pos<=m) update(2*now,pos);

else update(2*now+1,pos);

pushup(now);

}int ret=0;

void query(int now,int l,int r)

int m=(tree[now].l+tree[now].r)>>1;

if(l<=m) query(2*now,l,r);

if(r>m) query(2*now+1,l,r);

if(val[m]>t;

while(t--)

else}}

}

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

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

HDU 3308 LCIS 線段樹 區間合併

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

hdu3308 LCIS 線段樹 區間合併

n n 1e5 個數,m m 1e5 種操作,操作分兩種,u a b 0 aq a b 0 a b區間合併經典題目,每個點維護三個值,從左最長,從右最長和整段最長 注意合併的時候,要判斷a mid 1 a mid 時,才能從中間拼接,否則不能拼接 其餘部分,和區間合併沒區別,注意詢問別越界 incl...