BJOI 2018 题解

[BJOI2018]求和
可以预处理每一个 k 的答案,树上差分减一下即可
[BJOI2018]治疗之雨
单独写:传送门
[BJOI2018]链上二次求和
枚举 l e n len len, a n s = ∑ l e n = l r ∑ i = l e n n s u m i − s u m i − l e n ans=\sum_{len=l}^r \sum_{i=len}^nsum_i-sum_{i-len} ans=len=lri=lennsumisumilen
令 sum 的前缀和为 S
a n s = ∑ l e n = l r S n − S l e n − 1 − S n − l e n ans=\sum_{len=l}^rS_n-S_{len-1}-S_{n-len} ans=len=lrSnSlen1Snlen
容易想到用线段树什么的维护一下,每次查询 [ l − 1 , r − 1 ] , [ n − r , n − l ] [l-1,r-1],[n-r,n-l] [l1,r1],[nr,nl]的前缀和的区间和
考虑修改对 S S S 的影响
回到 S 本身的定义 S k = ∑ i = 1 k s u m i S_k=\sum_{i=1}^ksum_i Sk=i=1ksumi
对于在修改区间 [ l , r ] [l,r] [l,r] S i S_i Si,由于 s u m l sum_l suml 加了 v v v, s u m l + 1 sum_{l+1} suml+1 加了 v ∗ 2 v*2 v2
所以 S i S_i Si 会加上 ( i − l + 1 ) ∗ ( i − l + 2 ) ∗ v 2 \frac{(i-l+1)*(i-l+2)*v}{2} 2(il+1)(il+2)v
对于在 [ r + 1 , n ] [r+1,n] [r+1,n] S i S_i Si,由于 [ r + 1 , n ] [r+1,n] [r+1,n] s u m i sum_i sumi 每个都加了 l e n ∗ v len*v lenv
所以 S i S_i Si 会加上 l e n ∗ ( l e n + 1 ) ∗ v 2 + ( i − r ) ∗ l e n ∗ v \frac{len*(len+1)*v}{2}+(i-r)*len*v 2len(len+1)v+(ir)lenv
所以线段树直接维护 i , i 2 i,i^2 i,i2 的系数,以及常数项的系数

[BJOI2018]二进制
一道神仙动态dp
考虑哪些序列可以被排列成 3 的倍数
首先,二进制的奇数为模3余1,偶数位余2,也就是说要满足奇数为偶数位相同,或者在多出来 3 的倍数个1,考虑在长度为 len 的区间放 k 个 1,len - k 个 0
如果 k 是 偶数,那么可以匹配着放
如果 k 是 奇数,那么只能将 k - 3 匹配着放,如果 k = 1就凉了
于此同时,发现 3 个 1 直接至少要插 2 个 0,于是如果 0 是 0/1 的话也凉了
发现凉凉的情况比较好统计,于是用全部区间 - 凉凉区间
重新整理一下凉凉的定义:

  1. 有奇数个 1,但 0 只有 0/1 个
  2. 只有 1 个 1

等等,好像有点重复,我们把第2个改成只有一个 1,且 0 的次数 >=2 就不会重了
考虑如何合并两个端点,用 d l [ 0 / 1 ] [ 0 / 1 ] dl[0/1][0/1] dl[0/1][0/1] 强制从左端点开始选,有 0/1 个 0, 1 的奇偶性的区间个数
f l [ 0 / 1 / 2 ] fl[0/1/2] fl[0/1/2] 表示强制从左端点开始选,1 只有一次,0 的个数为 0 / 1 / > = 2 0/1/>=2 0/1/>=2,的区间个数
然后还要维护连续的 0 的个数以及区间 0/1 个数,最后就是恶心的 p u s h u p pushup pushup

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值