線段樹維護單調子串行

2021-10-04 10:11:16 字數 1731 閱讀 7767

顯然這樣的操作,區間無法直接合併

我們考慮o(l

ogn)

o(logn)

o(logn

)的push

uppushup

pushup

首先左兒子的最長長度不會變,我們考慮遞迴右兒子下去,並令當前的max

nmaxn

maxn

為左兒子的max

nmaxn

maxn

。1,如果當前pus

huppushup

pushup

的區間的max

n<=m

axnmaxn<=maxn

maxn

<=m

axn,那麼顯然都不符合條件直接ret

urn0

return 0

return

0.2,如果當前pus

huppushup

pushup

的區間最左端的點的斜ma

xn>maxn

>ma

xn,那麼直接當前區間的最長長度.

3,然後繼續遞迴下去

**如下

int

pushup2

(int k,

int l,

int r,

double maxn)

#include

#define m 100009

using

namespace std;

intread()

for(

;isdigit

(ch)

;ch=

getchar()

) re=

(re<<3)

+(re<<1)

+ch-

'0';

return re*f;

}int n,m;

double a[m]

;struct treetr[m*4]

;void

pushup1

(int k)

intpushup2

(int k,

int l,

int r,

double maxn)

void

update

(int k,

int l,

int r,

int pos,

int val)

int mid=

(l+r)

>>1;

if(pos<=mid)

update

(k<<

1,l,mid,pos,val)

;else

update

(k<<1|

1,mid+

1,r,pos,val)

;pushup1

(k);tr[k]

.len=tr[k<<1]

.len+

pushup2

(k<<1|

1,mid+

1,r,tr[k<<1]

.maxn);}

intmain()

return0;

}

線段樹 維護序列

老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為 n 的數列,不妨設為 a1,a2,an。有如下三種操作形式 把數列中的一段數全部乘乙個值 把數列中的一段數全部加乙個值 詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模 p 的值。輸入格式 第一行兩個整數 n 和 p ...

線段樹 I 維護序列

老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為 nn 的數列,不妨設為 a1,a2,ana1,a2,an。有如下三種操作形式 input 第一行兩個整數 nn 和 pp 第二行含有 nn 個非負整數,從左到右依次為 a1,a2,ana1,a2,an 第三行有乙個整數 mm,表示...

最長單調子串行(動態規劃)

最長上公升子串行 longest increasing subsequence 簡稱lis,也有些情況求的是最長非降序子串行,二者區別就是序列中是否可以有相等的數。例如 對於序列 1,7,3,5,9,4,8 我們就會得到一些上公升的子串行,如 1,7,9 3,4,8 1,3,5,8 等等,而這些子串...