首页 > 其他分享 >CF1603D Artistic Partition 题解

CF1603D Artistic Partition 题解

时间:2022-09-28 08:24:05浏览次数:77  
标签:limits int 题解 sum Partition CF1603D leq MAXN dp

题意

一个长度为 \(n\) 的序列,分为 \(k\) 段,每段代价是 \(c(l,r)=\sum\limits_{i=l}^r \sum\limits_{j=i}^r [\gcd(i,j)\geq l]\),求总代价的最小值。

分析

若 \(2^k>n\),总代价的最小值一定是 \(n\),因为此时最优分配方案就是让第 \(i\) 段的左端点是 \(2^{i-1}\),可以发现这样每一段中只有形如 \((x,x)\) 的数对才会对答案有贡献,因此总代价为 \(n\)。

对于其他的情况,设 \(dp_{i,j}\) 为分了 \(i\) 段,最后一段右端点为 \(j\) 的最小总代价,转移方程为:

\[dp_{i,j}=\min\limits_{k=1}^{j-1}\{dp_{i-1,k}+c(k+1,j)\} \]

大力推式子:

\[c(l,r)=\sum\limits_{i=l}^r \sum\limits_{j=i}^r [\gcd(i,j)\leq l]=\sum\limits_{k=l}^r\sum\limits_{i=l}^r \sum\limits_{j=i}^r [\gcd(i,j)=k]=\sum\limits_{k=l}^r\sum\limits_{i=1}^{\left\lfloor\frac{r}{k}\right\rfloor} \varphi(i) \]

,此时可以先预处理出欧拉函数并计算前缀和,然后暴力转移,时间复杂度 \(\mathcal{O}(n^2+n\sqrt{n})\),显然会 T,考虑优化,由于是个分段的形式,因此猜测有决策单调性,只需证明 \(c\) 函数满足四边形不等式,即证 \(c(i,k)+c(j,l)\leq c(i,l)+c(j,k)\),其中 \(i\leq j\leq k \leq l\)。

证明:

设 \(f(i,j,r)=\sum\limits_{k=i}^j\sum\limits_{t=1}^{\left\lfloor\frac{r}{k}\right\rfloor} \varphi(t)\),则

\[\begin{gather} c(i,k)+c(j,l)\leq c(i,l)+c(j,k) \\ \Longleftrightarrow c(i,k)+c(j,l)\leq f(i,l,l)+f(j,k,k) \\ \Longleftrightarrow f(i,j-1,l)+f(j,l,l)+f(i,k,k)-f(i,j-1,k) \\ \Longleftrightarrow c(i,k)+c(j,l)\leq c(i,k)+c(j,l)+f(i,j-1,l)-f(i,j-1,k) \\ \Longleftrightarrow f(i,j-1,k)\leq f(i,j-1,l) \end{gather} \]

,又因为 \(k\leq l\),所以显然成立。

观察转移方程,发现每次转移都只从上层转移,又有决策单调性,因此可以分治优化 dp,通过分治确定每个点的最优决策点的区间,而预处理一个 \(\varphi\) 的前缀和,就能在短时间内快速从相邻的转移,每次从左侧加入或删除一个数就直接加上它的贡献,从右侧加入或删除则需要重新计算代价函数。预处理出来每次输出结果即可。

核心代码

int T,n,m,pri[MAXN],tot,phi[MAXN],pre[MAXN],L=1,R,res;
int dp[MAXM][MAXN];bitset<MAXN>vis;vector<int>v[MAXN];
void sieve(int sz){
    pre[1]=vis[1]=phi[1]=1;
    for(int i=2;i<=sz;i++){
        if(!vis[i]) pri[++tot]=i,phi[i]=i-1;
        for(int j=1;j<=tot&&i*pri[j]<=sz;j++){
            vis[pri[j]*i]=true;
            if(i%pri[j]) phi[pri[j]*i]=phi[i]*phi[pri[j]];
            else{phi[pri[j]*i]=phi[i]*pri[j];break;}
        }pre[i]=pre[i-1]+phi[i]; 
    }
    for(int i=1;i<=sz;i++) for(int j=i;j<=sz;j+=i) v[j].push_back(i);
}
int cal(int l,int r){
    while(l<L) L--,res+=pre[R/L];
    while(r>R){R++;for(auto i:v[R]) if(i>=L) res+=phi[R/i];}
    while(l>L) res-=pre[R/L],L++;
    while(r<R){for(auto i:v[R]) if(i>=L) res-=phi[R/i];R--;}return res;
}
void solve(int l,int r,int pl,int pr,int k){
    if(l>r) return;int mid=(l+r)>>1,p=0,up=qmin(pr,mid-1),val;dp[k][mid]=inf;
    for(int i=pl;i<=up;i++)
        if(dp[k-1][i]+(val=cal(i+1,mid))<dp[k][mid]) dp[k][mid]=val+dp[k-1][i],p=i;
    solve(l,mid-1,pl,p,k);solve(mid+1,r,p,pr,k);
}
signed main(){
    int i,j,k;n=MAXN-5;m=17;sieve(n+2);
    for(i=1;i<=n;i++) dp[1][i]=cal(1,i);
    for(i=2;i<=m;i++) solve(1,n,0,n-1,i);
    qread(T);
    while(T--){
        qread(n,m);
        if(m>=17) printf("%lld\n",n);
        else printf("%lld\n",dp[m][n]);
    }return 0;
}

record

标签:limits,int,题解,sum,Partition,CF1603D,leq,MAXN,dp
From: https://www.cnblogs.com/lxy-2022/p/CF1603D-Solution.html

相关文章

  • Tomcat最全乱码问题解决方案(保姆教程)
    目录概述原因解决方法1.idea乱码和startup.bat启动控制台日志乱码(Tomcat日志乱码)2.浏览器乱码概述tomcat乱码问题相信大家肯定都遇见过,本篇将详细介绍有关Tomcat的各种......
  • vuejs 开发问题解决方案总结一
    文章中提到的很多东西都在我的demo中用到,我的demo地址:​​https://github.com/MrZhang123/Vue_project/tree/master/vue_spa_demo​​1.Vuejs组件vuejs构建组件使用Vue.comp......
  • mongoose连接collections会自动加s的问题解决
    问题的解决:设置mongoose.model()的第三个参数,代码如下。module.exports=mongoose.model('Course',userSchema,'course');或者,可以给Schema传入第二个参数,......
  • 【题解】CF1589D Guess the Permutation
    这是一个交互题!题目链接-->Problem-D-Codeforces题目大意这是一个交互题!给定一个长度为\(n\)的自然排列,但其中\([i,j-1],[j,k]\)两部分被翻转了。你可以进......
  • 题解【P7515 [省选联考 2021 A 卷] 矩阵游戏】
    P7515[省选联考2021A卷]矩阵游戏解题报告。不一定更好的阅读体验。一年前我在省选赛场上折戟沉沙,一年后我从到下的地方再摔一跤。我成功了,我仍然是以前的那个......
  • 洛谷 CF1257F Make Them Similar 灰 题解
    前言本题解采用折半搜索算法完成,对于不打算用这种方法的同学,这篇题解可能会浪费你人生中宝贵的十几分钟。思路此题似乎找不出什么好的性质,那么考虑暴力。发现\(x,a\)......
  • LG4463 calc 题解
    传送门题意一个序列$a_1,a_2,\dots,a_n$是合法的,当且仅当:$a_1,a_2,\dots,a_n$都是\([1,k]\)中的整数。$a_1,a_2,\dots,a_n$互不相等。一个序列的值定义为它里......
  • P4965 题解
    题目传送门被同机房神犇使用一顿晚饭的时间爆切并当成作业布置给我的题...虽然是紫,但实际难度处于可以接受的范围内。题目分析开始的思路是\(\text{set}\)乱搞,因为发......
  • AtCoder ABC 270 题解(D-F)
    AtCoderABC270题解(D-F)D-Stones(博弈DP)题目:​ 现在有一堆石子,一个序列a表示每次可以从石头里拿走多少个石子。当无法再拿出石头的时候,游戏结束。两边都以最佳策略......
  • 题解【CF1436E Complicated Computations】
    CF1436EComplicatedComputations解题报告。不一定更好的阅读体验。对于一个数\(x\),考虑什么条件\(x\)可以作为答案。首先要满足\(\forally\in[1,x)\),\(y\)......