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\) 的值。可以用李超线段树方便地求出。
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 值,再加上这一位枚举的数乘上位值。具体见代码。
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) \],树状数组维护即可。
标签:题意,limits,记录,花费,Codeforces,2400,序列,dp,dis 来源: https://www.cnblogs.com/lxy-2022/p/CF2400-zuo-ti-ji-lu.html