[CF1603D]Artistic Partition
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1603D]Artistic Partition相关的知识,希望对你有一定的参考价值。
Artistic Partition
题解
看到这种统计最小值的题应该很容易想到
d
p
dp
dp,我们可以记
d
p
i
,
j
dp_i,j
dpi,j表示划分到点
i
i
i,已经划分了
j
j
j块,但如果直接进行
d
p
dp
dp转移的话显然会
T
T
T。
但我们可以猜测到一点,当
K
K
K比较大的时候,我们应该很容易划分这个序列使得每个数在其区间中,与除自己外的所有数的
gcd
\\gcd
gcd都不大于改区间的
l
l
l。
也就是说我的的答案就为
n
n
n。
有了这个结论,我们就可以去想想怎么划分。
一个区间
[
l
,
r
]
[l,r]
[l,r]第一个会使得
gcd
(
l
,
r
)
⩾
l
\\gcd(l,r)\\geqslant l
gcd(l,r)⩾l的数对显然是
(
l
,
2
l
)
(l,2l)
(l,2l),也就是说,如果我们的
r
<
2
l
r< 2l
r<2l,改区间答案便为
r
−
l
+
1
r-l+1
r−l+1。
容易发现,这样的话,只要我们的
2
k
>
n
2^k>n
2k>n,就答案就为
n
n
n。也就是说,我们需要
d
p
dp
dp的
K
K
K是
log
n
\\log n
logn级别的,我们的总状态数是
n
log
n
n\\log n
nlogn级别。
我们的状态数大概无法继续优化了,但我们的
d
p
dp
dp转移是可继续优化的。
我们用
c
(
l
,
r
)
c(l,r)
c(l,r)表示将区间
[
l
,
r
]
[l,r]
[l,r]划分一段所产生的贡献,则转移式为:
d
p
i
,
k
=
min
j
=
0
i
−
1
(
d
p
j
,
k
−
1
+
c
(
j
+
1
,
i
)
)
dp_i,k=\\min_j=0^i-1\\left(dp_j,k-1+c(j+1,i)\\right)
dpi,k=j=0mini−1(dpj,k−1+c(j+1,i))显然,这个
d
p
dp
dp转移是单调的,对于
k
k
k相同的
d
p
dp
dp,显然我
i
i
i越大,我们的划分点就会继续右移。
事实上,我们可以通过说明对于
l
<
l
′
<
r
′
<
r
l<l'<r'<r
l<l′<r′<r,有
c
(
l
,
r
)
+
c
(
l
′
,
r
′
)
⩾
c
(
l
,
r
′
)
+
c
(
l
′
,
r
)
c(l,r)+c(l',r')\\geqslant c(l,r')+c(l',r)
c(l,r)+c(l′,r′)⩾c(l,r′)+c(l′,r)来证明它的单调性。
而这个式子显然是成立的,前面的部分比后面多了区间
[
l
,
l
′
)
[l,l')
[l,l′)与区间
(
r
′
,
r
]
(r',r]
(r′,r]间的贡献。
这样的话,我们就可以用分治优化我们的
d
p
dp
dp转移了。
但无论怎么转移,我们都需要快速求出我们的
c
(
l
,
r
)
c(l,r)
c(l,r)呀。
推一推
c
c
c的式子。
c
(
l
,
r
)
=
∑
i
=
l
r
∑
j
=
i
r
[
(
i
,
j
)
⩾
l
]
=
∑
d
=
l
r
∑
i
=
l
r
∑
j
=
i
r
[
(
i
,
j
)
=
d
]
=
∑
d
=
l
r
∑
i
=
1
⌊
r
d
⌋
∑
j
=
1
i
[
(
i
,
j
)
=
1
]
=
∑
d
=
l
r
∑
i
=
1
⌊
r
d
⌋
φ
(
i
)
=
∑
d
=
l
r
s
(
r
d
)
c(l,r)=\\sum_i=l^r\\sum_j=i^r[(i,j)\\geqslant l]=\\sum_d=l^r\\sum_i=l^r\\sum_j=i^r[(i,j)=d]\\\\ =\\sum_d=l^r\\sum_i=1^\\lfloor\\fracrd\\rfloor\\sum_j=1^i[(i,j)=1]=\\sum_d=l^r\\sum_i=1^\\lfloor\\fracrd\\rfloor\\varphi(i)=\\sum_d=l^rs(\\fracrd)
c(l,r)=i=l∑rj=i∑r[(i,j)⩾l]=d=l∑ri=l∑rj=i∑r[(i,j)=d]=d=l∑ri=1∑⌊dr⌋j=1∑i[(i,j)=1]=d=l∑ri=1∑⌊dr⌋φ(i)=d=l∑rs(dr)其中
s
(
n
)
=
∑
i
=
1
n
φ
(
i
)
s(n)=\\sum_i=1^n\\varphi(i)
s(n)=∑i=1nφ(i),也就是
φ
\\varphi
φ的前缀和。
而这就可以整除分块了,我们可以先预处理一下块的前缀和,每次查询就算一下它所在块后缀和,再加上整块的后缀和就行了。
这样就可以做到预处理
O
(
n
n
)
O\\left(n\\sqrt n\\right)
O(nn),单次查询
O
(
1
)
O\\left(1\\right)
O(1)。
事实上我们可以再将整个
d
p
dp
A Neural Algorithm of Artistic Style
Unity 之 ShaderGraph Artistic节点解析汇总
风格迁移论文理解--A Neural Algorithm of Artistic Style
每一个人都是梵高A Neural Algorithm of Artistic Style