做题记录 26.1.27

· · 个人记录

\textcolor{black}\odot P2305 [NOI2014] 购票

转移方程是显然的,等价于根到当前点的直链的一段后缀上查询一次函数最值

预处理出栈序,则这段后缀等价于出栈序在直链两段的点之间且已经 \text{dfs} 过的全体点,问题转化为线段树每个结点保存一个一次函数,查询区间内一次函数在一点的最值,线段树套李超树即可

时间复杂度 O(n\log n\log V),空间复杂度 O(n\log n)(注意插入李超树不要递归到叶子)

代码

参考

\textcolor{black}\odot AT_agc040_e [AGC040E] Prefix Suffix Addition

假定所有操作一之和为 b,操作二之和为 c,满足 \forall 0\le i\le n,b_i+c_i=a_i,则操作次数为 \sum_{i=0}^n([b_i>b_{i+1}]+[c_i<c_{i+1}])

dp_{i,j} 表示确定了 b_{0\sim i},满足 b_i=j 时的最小总操作次数,则

dp_{0,0}=0 dp_{i,j}=\sum_{0\le k\le a_{i-1}} (dp_{i-1,k}+[k>j]+[a_{i-1}-k<a_i-j])

a_{n+1}=0,答案为 \min dp_{n+1,\ast}

显然 dp_{i,\ast} 单调(假定第二维在 [0,a_i] 中),且极差不超过 2

因此可以将 dp_{i,\ast} 划分为三段,容易做到 O(n)

代码

参考

\textcolor{black}\odot AT_agc049_e [AGC049E] Increment Decrement

对于固定的 a_{1\sim n},考虑如何求出最小操作次数

dp_{i,j} 表示 a_{1\sim i}a_ij 次区间操作覆盖

显然初始 dp_{0,i}=c\times i,答案为 \min_j dp_{n,j},转移为

dp_{i,j}=|a_i-j|+\sum_k (dp_{i-1,k}+c\times \max(j-k,0))

显然可以用 \text{slope trick}dp_{i,\ast} 是凸的,斜率在 [-1,c+1] 范围内

初始转折点为 c0,对 a_i 转移时,令斜率为 -1 的部分斜率变为 0,斜率 c+1 的部分斜率变为 c,然后向转折点集合中加入两个 a_i,设操作后转折点集合的最小值为 p(即斜率等于 0 的段的左端点),则这一次操作对最小值的增量为 a_i-p(显然 p\le a_i

S 为转折点的可重集,初始 Sc0i=1 时加入 2a_1 并令贡献加上 a_1-pi\ge 2 时去掉 S 最小值最大值后加入两个 a_i 并令贡献加上 a_i-p

然后考虑题目的问题

先将 k^{n-1}\sum_i \sum_j b_{i,j} 计入答案,然后枚举 p\in \{b_{i,j}\},考虑统计出 p 作为 \min S 的出现次数 c,然后答案减去 c\times p

差分为计算 \min S<p 的次数和 \min S<p+1 的出现次数,显然形式相同,只考虑前者

b_{i,j}<p 的为 0\ge p 的为 1,则任意时刻 S 的状态可以由 1 的数量描述,最终 \min S<p 当且仅当 0\in S'

ct_i 表示 b_{i,\ast}1 的数量,令 dp_{i,j} 表示第 i 次操作后 S1 的数量为 j 的方案数

初始 dp_{1,0}=k-ct_1,dp_{1,2}=ct_1

$$ dp_{i+1,j}\gets dp_{i,j}\times(k-ct_{i+1}) $$ $$ dp_{i+1,j+2}\gets dp_{i,j}\times ct_{i+1} $$ 方案数为 $\sum_{i=1}^n dp_{i,c+2}\times k^{n-i}

容易做到 O(n^2k^2)

代码

参考

\blue\odot P3188 [HNOI2007] 梦幻岛宝珠

每组 (a,b) 放到 b 位置上,令 dp_{i,j} 表示忽略 2^i 以下的重量,目前选择了 j\times 2^i 的最大价值,转移是容易的

时间复杂度 O(TV^2\log V)

代码

参考

\textcolor{black}\odot CF1290F Making Shapes

等价于求 c_{1\sim n} 的数量满足 c_i\in \N\sum_i c_i x_i=0\sum_i c_i y_i=0\sum_i[x_i>0]c_ix_i\le m\sum_i[y_i>0]c_iy_i\le m

dp_{d,x_1,x_2,y_1,y_2,f_1,f_2} 表示确定了 \sum_i[x_i>0]c_ix_i-\sum_i[x_i<0]c_ix_i\sum_i[y_i>0]c_iy_i-\sum_i[y_i<0]c_iy_i 的低 d 位,它们 d 位到 d+1 位的进位分别为 x_1,x_2,y_1,y_2,其中前两项低 d 位相同,f_1 表示是否超过 m 的低 d 位,后两项低 d 位相同,f_2 表示是否超过 m 的低 d

转移时 O(2^n) 枚举 d+1 位上 c_i 的状态,容易 O(1) 转移

总时间复杂度 O((nV)^42^n\log m),其中 V=|x_i|

代码

参考

\purple\odot P12479 [集训队互测 2024] 长野原龙势流星群 \quad QOJ #9532. 长野原龙势流星群

初始每个点为一个连通块,每次选择平均值最大的一个连通块与其父亲合并,过程中维护每个结点作为根时连通块平均值的最大值

时间复杂度 O(n\log n)

luogu

QOJ

\textcolor{black}\odot AT_agc072_c [AGC072C] Human Exercise

考虑求出前 k-1 次行走后每个格子经过次数,则最后一次的结果容易模拟得到

显然由副对角线互为镜像的两个格子((x,y)(n-y+1,n-x+1))经过次数相同,因此只考虑左上部分

显然 (1,1) 经过次数为 k-1,可证经过 (i,j) 的每条路径,下一步以 i+j 为周期,每个周期前 i 步走到 (i+1,j),后 j 步走到 (i,j+1)

容易做到 O(n^2)

代码

参考