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