20.8.10 线段树专题

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=aval+bsum=sum+cval+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=a1a2b=b1a2+b2c=c1+a1c2d=d1+b1c2+d2
(把 v a l ′ = a 1 ⋅ v a l + b 1 val'=a_1\cdot val+b_1 val=a1val+b1带入 v a l ′ ′ = a 2 ⋅ v a l ′ + b 2 val''=a_2\cdot val'+b_2 val=a2val+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=1n12Si3ni1+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=S1S2val=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=1n2Si3ni1+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}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值