hdu 3308 LCIS(單點更新,區間合併)

2021-05-28 11:06:38 字數 739 閱讀 4711

題意:給你n個整數,有兩種操作,u a b把第a個數變成b,q a b查詢區間[a,b]的最長連續上公升序列。

在查詢的時候,要注意,如果查詢的範圍是在當前區間的左右兒子裡,並且左兒子的右端點小於右兒子的左端點,那麼不能直接取左兒子的rmx加上右兒子的lmx,因為有可能查詢的範圍的長度就已經小於左兒子的rmx加上右兒子的lmx,所以要加上乙個判斷。

/***風格更新後*/

#include #include #include using namespace std;

#define ll(x) (x<<1)

#define rr(x) (x<<1|1)

#define mid(a,b) (a+((b-a)>>1))

const int n=1e5+5;

struct node

int len()

};int y[n],n,m;

struct segtree

int dis()

};void unin(node &a,node &b,node &c)

}int query(int be,int end,int r)

else}}

}}seg;

int main()

{ int t;

scanf("%d",&t);

while(t--)

{int n,m;

scanf("%d%d",&n,&m);

for(int i=0;i

HDU 3308 LCIS(線段樹合併)

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

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

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

HDU 3308 LCIS 線段樹 區間合併

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