[CodeForces1603D] Artistic Partition(四边形不等式 + 决策单调性优化dp + 分治 + 线性筛 + 数论分块)

problem

codeforces

对于给定的正整数 l ≤ l\leq l,定义 c ( l , r ) c(l,r) c(l,r) 为满足下列条件的正整数对 ( i , j ) (i,j) (i,j) 的数量:

  • l ≤ i ≤ j ≤ r l\leq i\leq j\leq r lijr
  • gcd ⁡ ( i , j ) ≥ l \gcd(i,j)\geq l gcd(i,j)l

给定正整数 k ≤ n k\leq n kn

对所有满足 0 = x 1 < x 2 < ⋯ < x k < x k + 1 = n 0=x1<x2<⋯<xk<xk+1=n 0=x1<x2<<xk<xk+1=n 的整数序列 ( x 1 , . . . , x k + 1 ) (x_1,...,x_{k+1}) (x1,...,xk+1)

计算 ∑ i = 1 k c ( x i + 1 , x i + 1 ) \sum_{i=1}^kc(x_i+1,x_{i+1}) i=1kc(xi+1,xi+1) 的最小值。

你需要回答 T T T 组询问。

对全部数据, 1 ≤ T ≤ 3 × 1 0 5 1\leq T\leq 3\times 10^5 1T3×105 1 ≤ k ≤ n ≤ 1 0 5 1\leq k\leq n\leq 10^5 1kn105

solution

先设 f ( i , k ) : f(i,k): f(i,k): 枚举到 i i i 一共划分了 k k k 个组的最小值。

则有转移 f ( i , k ) = min ⁡ j ≤ i { f ( j − 1 , k − 1 ) + c ( j , i ) } f(i,k)=\min_{j\le i}\Big\{f(j-1,k-1)+c(j,i)\Big\} f(i,k)=minji{f(j1,k1)+c(j,i)}

但遗憾的是,时间空间双双起飞,而且空间并不能滚动掉。

不妨挖掘一下 c ( l , r ) c(l,r) c(l,r) 的性质:

  • ovservation1 : \text{ovservation1}: ovservation1: c ( l , r ) ≥ r − l + 1 c(l,r)\ge r-l+1 c(l,r)rl+1。显然至少每个 i ∈ [ l , r ] , ( i , i ) i\in[l,r],(i,i) i[l,r],(i,i) 点对就能提供一次贡献。
  • observation2 : c ( i , 2 i − 1 ) = i \text{observation2}:c(i,2i-1)=i observation2:c(i,2i1)=i。显然 [ i , 2 i − 1 ] [i,2i-1] [i,2i1] 中的任意两个数的 gcd ⁡ < i \gcd<i gcd<i

基于以上两个观察,不难得出当 n < 2 k n<2^k n<2k 时,答案一定为 n n n

因为我们有足够多的组数可以分成形如 c ( i , 2 i − 1 ) c(i,2i-1) c(i,2i1) 的形式。

所以我们状态设计的第二维就可以降成 log ⁡ \log log 级别。空间问题已经被解决了。

接下来考虑时间复杂度,其直接挂钩于优化 c ( l , r ) c(l,r) c(l,r) 的计算。
c ( l , r ) = ∑ i = l r ∑ j = i r [ gcd ⁡ ( i , j ) ≥ l ] = ∑ d = l r ∑ i = l r ∑ j = i r [ gcd ⁡ ( i , j ) = d ] = ∑ d = l r ∑ i = ⌈ l d ⌉ ⌊ r d ⌋ ∑ j = i ⌊ r d ⌋ [ gcd ⁡ ( i , j ) = 1 ] = ∑ d = l r ∑ i = 1 ⌊ r d ⌋ ∑ j = i ⌊ r d ⌋ [ gcd ⁡ ( i , j ) = 1 ] = ∑ d = l r ∑ j = 1 ⌊ r d ⌋ ∑ i = 1 j [ gcd ⁡ ( i , j ) = 1 ] = ∑ d = l r ∑ i = 1 ⌊ r d ⌋ φ ( i ) c(l,r)=\sum_{i=l}^r\sum_{j=i}^r[\gcd(i,j)\ge l]=\sum_{d=l}^r\sum_{i=l}^r\sum_{j=i}^r[\gcd(i,j)=d]\\ =\sum_{d=l}^r\sum_{i=\lceil\frac{l}{d}\rceil}^{\lfloor\frac rd\rfloor}\sum_{j=i}^{\lfloor\frac rd\rfloor}[\gcd(i,j)=1]=\sum_{d=l}^r\sum_{i=1}^{\lfloor\frac rd\rfloor}\sum_{j=i}^{\lfloor\frac rd\rfloor}[\gcd(i,j)=1]\\ =\sum_{d=l}^r\sum_{j=1}^{\lfloor\frac rd\rfloor}\sum_{i=1}^j[\gcd(i,j)=1]=\sum_{d=l}^{r}\sum_{i=1}^{\lfloor\frac rd\rfloor}\varphi(i) c(l,r)=i=lrj=ir[gcd(i,j)l]=d=lri=lrj=ir[gcd(i,j)=d]=d=lri=dldrj=idr[gcd(i,j)=1]=d=lri=1drj=idr[gcd(i,j)=1]=d=lrj=1dri=1j[gcd(i,j)=1]=d=lri=1drφ(i)
S ( n ) = ∑ i = 1 n φ ( i ) S(n)=\sum_{i=1}^n\varphi(i) S(n)=i=1nφ(i),即 φ ( i ) \varphi(i) φ(i) 的前缀和。则 c ( l , r ) = ∑ i = l r S ( ⌊ r i ⌋ ) c(l,r)=\sum_{i=l}^rS(\lfloor\frac ri\rfloor) c(l,r)=i=lrS(ir)

O ( n ) O(n) O(n) 线性筛预处理 φ ( i ) , S ( i ) \varphi(i),S(i) φ(i),S(i) 后,可以数论分块做到 O ( r − l + 1 ) O(\sqrt{r-l+1}) O(rl+1 ) 计算。

考虑进一步地优化转移。

k k k 只与 k − 1 k-1 k1 挂钩。所以状态转移的时候不妨先枚举 k k k 再枚举 i i i

对于固定的 k k k,我们简化内层转移写成 f ( i ) = min ⁡ j ≤ i { f ( j − 1 ) + c ( j , i ) } f(i)=\min_{j\le i}\Big\{f(j-1)+c(j,i)\Big\} f(i)=minji{f(j1)+c(j,i)}

看见这种形式的转移方程,我们 打表验证 大胆猜测是决策单调性的。

  • 证明 c ( l , r ) c(l,r) c(l,r) 区间包含单调性。

    ∀   l ≤ l ′ ≤ r ′ ≤ r \forall\ l\le l'\le r'\le r  llrr c ( l ′ , r ′ ) ≤ c ( l , r ) c(l',r')\le c(l,r) c(l,r)c(l,r)。根据 c ( l , r ) c(l,r) c(l,r) 的定义显然。

  • 证明 c ( l , r ) c(l,r) c(l,r) 满足四边形不等式(交叉小于包含)。

    ∀   l 1 < l 2 < r 1 < r 2 \forall\ l_1<l_2<r_1<r_2  l1<l2<r1<r2 c ( l 1 , r 1 ) + c ( l 2 , r 2 ) ≤ c ( l 1 , r 2 ) + c ( l 2 , r 1 ) c(l_1,r_1)+c(l_2,r_2)\le c(l_1,r_2)+c(l_2,r_1) c(l1,r1)+c(l2,r2)c(l1,r2)+c(l2,r1)
    c ( l 1 , r 2 ) + c ( l 2 , r 1 ) = ∑ i = l 1 r 2 S ( ⌊ r 2 i ⌋ ) + ∑ i = l 2 r 1 S ( ⌊ r 1 i ⌋ ) = ∑ i = l 1 l 2 − 1 S ( ⌊ r 2 i ⌋ ) + ∑ i = l 2 r 2 S ( ⌊ r 2 i ⌋ ) + ∑ i = l 1 r 1 S ( ⌊ r 1 i ⌋ ) − ∑ i = l 1 l 2 − 1 S ( ⌊ r 1 i ⌋ ) = ∑ i = l 1 l 2 − 1 ( S ( ⌊ r 2 i ⌋ ) − S ( ⌊ r 1 i ⌋ ) ) + ∑ i = l 2 r 2 S ( ⌊ r 2 i ⌋ ) + ∑ i = l 1 r 1 S ( ⌊ r 1 i ⌋ ) = ∑ i = l 1 l 2 − 1 ( S ( ⌊ r 2 i ⌋ ) − S ( ⌊ r 1 i ⌋ ) ) + c ( l 2 , r 2 ) + c ( l 1 , r 1 ) c(l_1,r_2)+c(l_2,r_1)=\sum_{i=l_1}^{r_2}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_2}^{r_1}S(\lfloor\frac{r_1}{i}\rfloor)\\ =\sum_{i=l_1}^{l_2-1}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_2}^{r_2}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_1}^{r_1}S(\lfloor\frac{r_1}{i}\rfloor)-\sum_{i=l_1}^{l_2-1}S(\lfloor\frac{r_1}{i}\rfloor)\\ =\sum_{i=l_1}^{l_2-1}\Big(S(\lfloor\frac{r_2}{i}\rfloor)-S(\lfloor\frac{r_1}{i}\rfloor)\Big)+\sum_{i=l_2}^{r_2}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_1}^{r_1}S(\lfloor\frac{r_1}{i}\rfloor)\\ =\sum_{i=l_1}^{l_2-1}\Big(S(\lfloor\frac{r_2}{i}\rfloor)-S(\lfloor\frac{r_1}{i}\rfloor)\Big)+c(l_2,r_2)+c(l_1,r_1) c(l1,r2)+c(l2,r1)=i=l1r2S(ir2)+i=l2r1S(ir1)=i=l1l21S(ir2)+i=l2r2S(ir2)+i=l1r1S(ir1)i=l1l21S(ir1)=i=l1l21(S(ir2)S(ir1))+i=l2r2S(ir2)+i=l1r1S(ir1)=i=l1l21(S(ir2)S(ir1))+c(l2,r2)+c(l1,r1)
    显然 ∑ i = l 1 l 2 − 1 ( S ( ⌊ r 2 i ⌋ ) − S ( ⌊ r 1 i ⌋ ) ) ≥ 0 \sum_{i=l_1}^{l_2-1}\Big(S(\lfloor\frac{r_2}{i}\rfloor)-S(\lfloor\frac{r_1}{i}\rfloor)\Big)\ge0 i=l1l21(S(ir2)S(ir1))0,所以 $ c(l_1,r_2)+c(l_2,r_1)\ge c(l_1,r_1)+c(l_2,r_2)$ 得证。

所以 f ( i ) f(i) f(i) 是具有决策点单调的性质的。经典 1D1D \text{1D1D} 1D1D 类单调性优化。

  • 证明 f ( i ) f(i) f(i) 具有决策单调性。

    即设 g ( i ) g(i) g(i) i i i 的最佳转移决策点,则 ∀ j < i   g ( j ) ≤ g ( i ) \forall_{j<i}\ g(j)\le g(i) j<i g(j)g(i)

    y < x < j < i y<x<j<i y<x<j<i,且 f ( j ) f(j) f(j) 的最佳决策点为 x x x。则有:

    • f ( x − 1 , j ) + c ( x , j ) ≤ f ( y − 1 , j ) + c ( y , j ) f(x-1,j)+c(x,j)\le f(y-1,j)+c(y,j) f(x1,j)+c(x,j)f(y1,j)+c(y,j)
    • c ( y , j ) + c ( x , i ) ≤ c ( y , i ) + c ( x , j ) c(y,j)+c(x,i)\le c(y,i)+c(x,j) c(y,j)+c(x,i)c(y,i)+c(x,j)

    两式相加有: f ( x − 1 ) + c ( x , j ) + c ( y , j ) + c ( x , i ) ≤ f ( y − 1 ) + c ( y , j ) + c ( y , i ) + c ( x , j ) f(x-1)+c(x,j)+c(y,j)+c(x,i)\le f(y-1)+c(y,j)+c(y,i)+c(x,j) f(x1)+c(x,j)+c(y,j)+c(x,i)f(y1)+c(y,j)+c(y,i)+c(x,j)

    化简后有: f ( x − 1 ) + c ( x , i ) ≤ f ( y − 1 ) + c ( y , i ) f(x-1)+c(x,i)\le f(y-1)+c(y,i) f(x1)+c(x,i)f(y1)+c(y,i)

    所以对于 i i i 而言,最佳决策点选 x x x 一定优于/不劣于选 y y y

那么我们就对于外层枚举的每一个 k k k,跑决策点的分治。

( l , r , L , R ) (l,r,L,R) (l,r,L,R) :处理 i ∈ [ l , r ] i\in[l,r] i[l,r] 的最优决策点落在 [ L , R ] [L,R] [L,R] 区间内。

m i d = l + r 2 mid=\frac{l+r}2 mid=2l+r,先算出 c ( R + 1 , m i d ) c(R+1,mid) c(R+1,mid),然后 c ( i , m i d ) = c ( i + 1 , m i d ) + S ( ⌊ m i d i ⌋ ) c(i,mid)=c(i+1,mid)+S(\lfloor\frac{mid}{i}\rfloor) c(i,mid)=c(i+1,mid)+S(imid)

再从 min ⁡ ( m i d , R ) \min(mid,R) min(mid,R) 开始 → L \rightarrow L L 枚举 m i d mid mid 的最佳决策点。

因为最佳决策点编号必须小于自己编号。

再根据 m i d mid mid 分成左右并把决策点区间分成左右。

复杂度额额额,约莫 O ( n + T + k n n log ⁡ n ) O(n+T+kn\sqrt{n}\log n) O(n+T+knn logn)

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100005
int T, n, cnt;
int prime[maxn], phi[maxn], vis[maxn], S[maxn];
int f[maxn][20];

void sieve( int n = 1e5 ) {
	phi[1] = 1;
	for( int i = 2;i <= n;i ++ ) {
		if( ! vis[i] ) prime[++ cnt] = i, phi[i] = i - 1;
		for( int j = 1;j <= cnt and i * prime[j] <= n;j ++ ) {
			vis[i * prime[j]] = 1;
			if( i % prime[j] == 0 ) {
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
			else phi[i * prime[j]] = phi[i] * phi[prime[j]];
		}
	}
	for( int i = 1;i <= n;i ++ ) S[i] = S[i - 1] + phi[i];
}

int calc( int l, int r ) {
	int ans = 0;
	for( int i;l <= r;l = i + 1 ) {
		i = min( r / ( r / l ), r );
		ans += S[r / l] * ( i - l + 1 );
	}
	return ans;
}

void solve( int l, int r, int L, int R, int k ) {
	if( l > r ) return;
	int mid = l + r >> 1;
	int sum = calc( R + 1, mid );
	int ans = 1e18, pos;
	for( int i = min( R, mid );i >= L;i -- ) {
		sum += S[mid / i];
		if( sum + f[i - 1][k - 1] <= ans )
			ans = sum + f[i - 1][k - 1], pos = i;
	}
	f[mid][k] = ans;
	solve( l, mid - 1, L, pos, k );
	solve( mid + 1, r, pos, R, k );
}

signed main() {
	for( int i = 1;i <= 1e5;i ++ ) f[i][1] = i * (i + 1) >> 1;
	sieve();
	for( int k = 2;k <= 17;k ++ ) solve( 1, 1e5, 1, 1e5, k );
	scanf( "%lld", &T );
	while( T -- ) {
		int k;
		scanf( "%lld %lld", &n, &k );
		if( k > 17 or (1 << k) > n ) printf( "%lld\n", n );
		else printf( "%lld\n", f[n][k] ); 
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值