其他分享
首页 > 其他分享> > Codeforces *2400 做题记录

Codeforces *2400 做题记录

作者:互联网

CF1715E 题解

题意

一个带边权无向图,可以沿着边走,需要边权的花费或从任意点 \(u\) 飞到 \(v\),需要 \((u-v)^2\) 的花费。求从点 \(1\) 到所有 \(i\) 的最少花费。最多飞 \(k\) 次。

分析

一眼最短路 + dp。

发现 \(k\) 很小,可以枚举飞的次数,对于点 \(u\),可以是走到 \(u\),这种情况可以用最短路更新答案;也可以是飞到 \(u\),此时可以 dp,\(dp_i\) 表示从 \(1\) 到 \(i\) 最小花费,转移方程很显然:

\[dp_i=\min\limits_{t=1}^n(dis_t+(i-t)^2) \]

,其中 \(dis_i\) 表示上个 \(k\) 算出的 \(1\) 到 \(i\) 最少花费。此时最外层循环 \(k\),中层循环 \(i\),内层循环 \(t\),时间复杂度 \(\mathcal{O}(kn^2)\),发现会 T,考虑优化。

发现这个式子是个典型的斜率优化形式,可以变形成:

\[dp_i=\min\limits_{t=1}^n(dis_t+(i-t)^2) \\ \ \ \ \ \ \ \ \ \ \ \ \ =\min\limits_{t=1}^n(dis_t+t^2+it)+i^2 \]

也就转化成了求 \(x=i\) 时所有直线 \(y=tx+(dis_t+t^2)\) 的最小值加上 \(i^2\) 的值。可以用李超线段树方便地求出。

code

CF1073E

题意

求 \([l,r]\) 内包含数码个数不超过 \(k\) 的数之和,\(l\leq r\leq10^{18},k\leq 10\)。

分析

数位 dp。

设计状态 \(dp_{i,j}\),\(dp_{i,j,0}\) 表示到第 \(i\) 位,包含的数码集为 \(j\) 时的数的个数,\(dp_{i,j,1}\) 表示数的和。

转移时将这位的 dp 值加上下一位的 dp 值,再加上这一位枚举的数乘上位值。具体见代码。

code

CF946G

题意

定义一个序列 A 是好的,当 A 满足从 A 中去掉一个位置之后剩下的序列形成了一个严格递增序列。 给出一个长度为 \(n\) 的序列,问最小需要改动多少个位置的值,使得这个序列变成好的。

分析

首先可以发现将一个序列 \(a_i\) 变为严格递增的修改次数等于序列 \(b_i=a_i-i\) 的最长不下降子序列长度。

证明:

一个序列 \(a_i\) 严格递增当且仅当对于任意 \(i,j (i<j)\),满足 \(a_j-a_i\leq j-i\),因为这样才能保证在 \([i,j]\) 内的两数间差大于 \(1\)。

于是问题就转化为求序列 \(b\) 去掉一个后的最长不降子序列长度。

\(dp_{i,0/1}\) 表示前 \(i\) 个数中扔掉一个/不扔的最长不降子序列长度。

首先考虑不新扔一个时的转移,有

\[dp_{i,0}=\max\limits_{j<i}\{dp_{j,0}\}+1(a_j-a_i\leq j-i),\\dp_{i,1}=\max\limits_{j<i}\{dp_{j,1}\}+1(a_j-a_i\leq j-i) \]

若新扔一个,可以发现扔的元素后面的下标都减 \(1\) 则有

\[dp_{i,1}=\max\limits_{j<i-1}\{dp_{j,0}\}+1(a_j-a_i\leq j-i+1) \]

,树状数组维护即可。

code

标签:题意,limits,记录,花费,Codeforces,2400,序列,dp,dis
来源: https://www.cnblogs.com/lxy-2022/p/CF2400-zuo-ti-ji-lu.html