2728 – 【SCOI2010】序列操作
区间最大连续子段和模板,注意pushdown顺序,先fill再rev,打fill标记清rev标记
1693 – 【BZOJ4262】Sum
题意:设 f ( x ) l , r = ∑ i = l r m a x { i , x } f(x)_{l,r}=\sum_{i=l}^r max\{i,x\} f(x)l,r=∑i=lrmax{i,x},求 ∑ i = l 2 r 2 f ( i ) l 1 , r 1 \sum_{i=l_2}^{r_2} f(i)_{l_1,r_1} ∑i=l2r2f(i)l1,r1
区间和转化成前缀和相减,即计算 ∑ i = 1 n f ( i ) l 1 , r 1 \sum_{i=1}^{n}f(i)_{l_1,r_1} ∑i=1nf(i)l1,r1
离线询问,每次多加一个点,用线段树维护任意 f ( i ) l , r f(i)_{l,r} f(i)l,r的值
- v a l val val,当前值 f ( n ) l , r f(n)_{l,r} f(n)l,r
- s u m sum sum,历史和 ∑ i = 1 n f ( i ) l , r \sum_{i=1}^nf(i)_{l,r} ∑i=1nf(i)l,r
- a , b , c , d a,b,c,d a,b,c,d四个转移系数
转移系数的意义是:
v
a
l
′
=
a
⋅
v
a
l
+
b
,
s
u
m
′
=
s
u
m
+
c
⋅
v
a
l
+
d
val'=a\cdot val+b,sum'=sum+c\cdot val+d
val′=a⋅val+b,sum′=sum+c⋅val+d
转移系数的更新:
a
=
a
1
a
2
,
b
=
b
1
a
2
+
b
2
,
c
=
c
1
+
a
1
c
2
,
d
=
d
1
+
b
1
c
−
2
+
d
2
a=a_1a_2,b=b_1a_2+b_2,c=c_1+a_1c_2,d=d_1+b_1c-2+d_2
a=a1a2,b=b1a2+b2,c=c1+a1c2,d=d1+b1c−2+d2
(把
v
a
l
′
=
a
1
⋅
v
a
l
+
b
1
val'=a_1\cdot val+b_1
val′=a1⋅val+b1带入
v
a
l
′
′
=
a
2
⋅
v
a
l
′
+
b
2
val''=a_2\cdot val'+b_2
val′′=a2⋅val′+b2手动推推即可,
s
u
m
′
′
sum''
sum′′同理)
3387 – 【SHOI2015】脑洞治疗仪
0操作维护区间覆盖
1操作分三步,区间1个数,区间覆盖,区间放置(?),前两个操作可以一个函数一起处理了,主要是区间放置
把询问区间按线段树拆分成几个区间,从左往右放,维护0的个数看能不能放完,放一个区间覆盖一个区间
遇到放不完区间再写个函数进去放,还是能放左边放左边,用0的个数判断
2操作区间最大连续子段和套路操作
1703 – 【BZOJ4499】线性函数
老套路推式子线段树,合并两个函数:
k
2
(
k
1
x
+
b
1
)
+
b
2
=
k
1
k
2
x
+
k
2
b
1
+
b
2
k_2(k_1x+b_1)+b_2=k_1k_2x+k_2b_1+b_2
k2(k1x+b1)+b2=k1k2x+k2b1+b2
k
=
k
1
k
2
,
b
=
k
2
b
1
+
b
2
k=k_1k_2,b=k_2b_1+b_2
k=k1k2,b=k2b1+b2
所以维护
k
,
b
k,b
k,b就行了
然后单点修改可以一路pushup上来
6239 – 【SHOI2016】随机序列
设
S
i
S_i
Si为前缀积,那么答案为
∑
i
=
1
n
−
1
2
S
i
⋅
3
n
−
i
−
1
+
S
n
\sum_{i=1}^{n-1} 2S_i\cdot3^{n-i-1}+S_n
∑i=1n−12Si⋅3n−i−1+Sn
简易说明:把用乘号连接的看成一块,对于每个带符号的块,带"+“和带”-"出现的次数相同,所以抵了,总和就只剩下第一块乘上方案数。所以枚举第一块的长度即可
维护
S
,
v
a
l
,
s
z
S,val,sz
S,val,sz,表示积,答案,长度
S
=
S
1
S
2
,
v
a
l
=
3
s
z
2
v
a
l
1
+
S
1
v
a
l
2
S=S_1S_2,val=3^{sz_2}val_1+S_1val_2
S=S1S2,val=3sz2val1+S1val2
tips:为了方便线段树处理,原式可以写成 ∑ i = 1 n 2 S i ⋅ 3 n − i − 1 + 1 3 S n \sum_{i=1}^n2S_i\cdot3^{n-i-1}+\frac13S_n ∑i=1n2Si⋅3n−i−1+31Sn,即把 S n S_n Sn拆成 2 3 S n + 1 3 S n \frac23S_n+\frac13S_n 32Sn+31Sn
1586 – 【BZOJ3702】二叉树
合并两个子树时,子树内答案与顺序无关,只用考虑两子树间的逆序对
用(权值)线段树合并,合并的时候分别用 n u m 1 , n u m 2 num1,num2 num1,num2记录左对右和右对左的逆序对 n u m 1 + = l s z ( l c ) ∗ r s z ( r c ) , n u m 2 + = r s z ( l c ) ∗ l s z ( r c ) num1+=lsz(lc)*rsz(rc),num2+=rsz(lc)*lsz(rc) num1+=lsz(lc)∗rsz(rc),num2+=rsz(lc)∗lsz(rc),然后 a n s + = m i n { n u m 1 , n u m 2 } ans+=min\{num1,num2\} ans+=min{num1,num2}