顯然這樣的操作,區間無法直接合併
我們考慮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 等等,而這些子串...