[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=lr∑i=lennsumi−sumi−len
令 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=lrSn−Slen−1−Sn−len
容易想到用线段树什么的维护一下,每次查询
[
l
−
1
,
r
−
1
]
,
[
n
−
r
,
n
−
l
]
[l-1,r-1],[n-r,n-l]
[l−1,r−1],[n−r,n−l]的前缀和的区间和
考虑修改对
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
v∗2 …
所以
S
i
S_i
Si 会加上
(
i
−
l
+
1
)
∗
(
i
−
l
+
2
)
∗
v
2
\frac{(i-l+1)*(i-l+2)*v}{2}
2(i−l+1)∗(i−l+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
len∗v
所以
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+(i−r)∗len∗v
所以线段树直接维护
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,但 0 只有 0/1 个
- 只有 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