[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 rl+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=0mini1(dpj,k1+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=lrj=ir[(i,j)l]=d=lri=lrj=ir[(i,j)=d]=d=lri=1drj=1i[(i,j)=1]=d=lri=1drφ(i)=d=lrs(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

在QtCreater中配置Artistic Style格式化Qt程序源代码

开源项目相关的各种许可证