杂题选做-1

#01 CF1566F

题目传送门

我们先去掉初始就被访问的区间;然后套路地,如果一个区间包含了其他区间,那么该区间可以去掉。

然后我们考虑一个点的移动范围:就是它左边的点到它右边的点构成的区间。否则我们完全可以让左边或右边的点去移动。

然后一个点至多换一次方向,不然一定可以转化为只换一次方向且次数更少的方案。特别地,我们将不换方向的运动看成反方向不移动后换一次方向的运动。

于是我们对于相邻的两个点进行 dp,枚举它们之间的两个相邻区间,然后枚举两个点的初始运动方向。转移即可。

#02 P8179

题目传送门

首先,我们注意到:一个轮胎的使用时间是一段连续区间。不然可以把所有区间合并,然后节省换胎时间。

其次,我们考虑 \(t = 0\) 怎么做。此时使用费用是单调递增的,于是我们可以使用栈来维护当前最小代价。

那么 \(t \neq 0\) 呢?我们考虑把 \(t\) 加到第一次使用的代价,然后就发现此时费用并不单调。

但是我们发现取到第 \(\sqrt t+1\) 个时,因为加 \(t\) 导致影响就没了。(因为此时代价不小于第一个,所以能取到说明即使第一个加了 \(t\),这个物品取这么多个还是优的)

因此我们对前 \(\sqrt t\) 次此时做分组背包,对之后的使用用堆来维护。

可以明确的是:我们的选取一定是合法的,因为如果前面背包部分取不到 \(\sqrt t\) 个,那么说明取 \(\sqrt t\) 个不优,取 \(\sqrt t+1\) 个更不优。

#03 CF1446D2

题目传说门

首先,如果序列有两个众数,那么就做完了。

然后,如果序列只有一个众数,那么在答案序列里,整个序列的众数也一定是该序列的众数(不然我们一定可以扩展到一个更大的区间,使得该区间满足条件)。

然后我们考虑枚举区间内另一个众数是什么。

我们设整个序列众数为 \(x\),枚举到的数为 \(y\)

那么我们考虑一个 \(y\) 的贡献:就是和它左右的一个 \(x\) 匹配。于是对于每一个 \(y\),我们找到它的前驱和后继 \(x\),然后将 \(x\) 加入判断队列,然后从序列中删去。

那么最后序列里还剩下一些 \(x\),说明这些 \(x\) 是无论如何也匹配不了的,就视为分隔符。

在两个分割符之间,我们要求一个最长区间,使得区间内权值和为 \(0\),这是可以在 \(O(n)\) 内处理的问题。

有一个细节,因为我们的下标不连续,所以我们在计算长度时要慎重。

#04 P9499

题目传送门

首先,考虑暴力 dp 。

我们令 \(f_{i,j}\) 表示当前正在处理第 \(i\) 个物品的贡献,且剩下 \(j\) 个物品。

考虑转移:

  • 从第 \(i-1\) 个物品换过来:$ f_{\large i,\lfloor \frac{k}{x_{i-1}} \rfloor +c_i}=f_{i-1,k}$;

  • 直接用一些物品来贡献价值:\(f_{i,j}=\max \limits_{k} f_{i,j+k}+kv_i\)

那么我们把 \(f_i\) 看做一个函数,那么上述转移实质上是:

  • \(f_i\) 向右平移 \(c_i\) 个单位;
  • 然后做一个完全背包;
  • 最后将图像缩放 \(x_i\) 倍(即只保留 \(x_i,2x_i,\cdots,kx_i\) 的点)。

那么大胆猜测,\(f_i\) 是一个凸函数,因为:

  • 平移、缩放不影响凸性;

  • 类似第二种转移的式子,就是 \(f_i\)\(\{0,v_i,2v_i,3v_i,\cdots,kv_i\}\) 做闵可夫斯基和。

那么我们考虑维护这个凸函数:

  • 平移就是打全局标记;

  • 闵可夫斯基和就是去掉差分数组中斜率小于 \(v_i\) 的函数段;

  • 缩放:首先 \(x_i=1\) 是不需要处理的。考虑 \(x_i>1\) 的情况,我们对于每一个拐点,找到它左右第一个横坐标为 \(x_i\) 的倍数的点,将其加入新的拐点序列中;对于新的拐点序列里的点,如果相邻两个点之间有原拐点,那么缩放后横坐标差为 \(1\),直接计算斜率即可;否则,将斜率乘以 \(x_i\)

分析时间复杂度:

对于每一个点,每处理一次,它的横坐标就至少减一半。所以至多操作 \(x_i\) 次。因此时间复杂度为 \(O(n\log\sum c_i)\)

#05 P7219

题目传送门

我们考虑对每一个点进行分析:假设我们分析到了第 \(i\) 个点,那么能和第 \(i\) 个点构成星座的点应该在一个区间 \([l,r]\) 内,其中 \([l,r]\)\(x_i\) 在的黑色空格极长连续段的区间。那么我们考虑这个区间内所有点的权值,其为 \(w_i\),贪心地,我们想在 \(c_i\)\(w_i\) 中选一个较小值。如果 \(c_i\) 比较小,那么直接删去 \(i\) 即可;如果 \(w_i\) 比较小,那么删去下方的点即可。但是,我们在之后的操作中 \(i\) 也可能被删掉,那么 \(i\) 下面的点就可以再加进来了。综上分析,我们把 \(i\) 的权值定义为 \(c_i-w_i\),即删去 \(i\) 后加入 \(i\) 下方点这一过程产生的代价差。

那么为什么第一种情况不需要进行处理呢?因为如果 \(i\) 下面的点都被删了,那么选下面的点是不优的;因为选 \(i\) 比选下面的点更不优,而且 \(i\) 和当前处理的点一定可以构成星座(\(i\) 下方的点都可以了,\(i\) 自然也是可以的),所以 \(i\) 这是也不会被选到,也就不需要进行类似处理。

这也是反悔贪心的思想。

#06 P5904

题目传送门

长链剖分优化 dp 入门题。

考虑 \(O(n^2)\) 能不能做。考虑答案只有两种情况:一是三个点的的 LCA 在三个点中,二是三个点的 LCA 不在三个点中。

我们在 LCA 处计数。我们记 \(d(x,y)\) 表示 \(x\)\(y\) 的距离,\(g_{i,j}\) 表示在 \(i\) 子树内,有多少二元组 \((x,y)\) 满足 \(d(x,LCA(x,y))=d(y,LCA(x,y))=d(LCA(x,y),i)+j\)\(f_{i,j}\) 表示在 \(i\) 子树内,有多少 \(x\) 满足,\(d(x,i)=j\)

那么 \(u\) 点对答案的贡献为 \(g_{u,0}+\sum \limits_{x,y\in son(x),x \neq y} f_{x,j-1}\times g_{y,j+1}\),其中 \(g_{i,0}\) 是第一种情况的贡献,其余部分是第二种情况的部分。

考虑转移。\(f\) 的转移是简单的,有 \(f_{u,i}=\sum \limits_{v \in son(u)}f_{v,i-1}\)

对于 \(g\),我们考虑对 \(x,y\) 是否在同一个儿子的子树内进行讨论,有 \(g_{u,i}=\sum \limits_{x,y \in son(u),x \neq y} f_{x,i-1}\times f_{y,i-1}+\sum \limits_{v \in son(u)} g_{v,i+1}\)

直接做时间复杂度为 \(O(n^2)\),使用长链剖分可以做到 \(O(n)\)

具体地,我们使用指针 \(O(1)\) 继承长儿子信息,对短儿子暴力维护,因为每一个节点的信息仅在链顶跳回父亲时被暴力维护一次,所以时间复杂度为 \(O(n)\)

#07 P9339

题目传送门

首先,我记 \(c_i\) 表示第 \(i\) 个桶的大小。我们考虑怎么证明一组 \(c\) 合法。

由于题目类似于“饼干匹配盒子”,所以考虑建立二分图模型:

  • 左边有 \(\sum \limits_i a_i\) 个点,分成 \(n\) 组,第 \(i\) 组有 \(a_i\) 个点,表示第 \(i\) 种饼干有 \(a_i\) 个;

  • 右边有 \(\sum \limits_i c_i\) 个点,分成 \(n\) 组,第 \(i\) 组有 \(c_i\) 个点,表示第 \(i\) 个盒子有 \(c_i\) 容量;

  • 左边每一组向右边每一组连边。

因为 \(c\) 合法当且仅当上述方法构造出的二分图存在完美匹配,考虑使用 Hall 定理,那么存在完美匹配需要满足:

我们枚举右侧点组的一个子集 \(S\),存在:\(\sum \limits_{i \in S} c_i \le \sum \limits_{1\le i \le n}\min(a_i,|S|)\)

那么容易发现,当 \(S\) 限制最强时, \(S\)\(c\) 中前 \(i\) 大的元素构成的集合。

那么依此做背包即可,我们记 \(f_{i,j,k}\) 表示考虑了前 \(i\) 大的高度,且目前已经确定了 \(j\) 堆的高度,且高度和为 \(k\) 是否可行。

自然地,有 \(f_{i,j,k}=f_{i-1,j,k} \lor f_{i,j-1,k-b_i}\)。因为 \(j \le \dfrac{k}{b_i}\),所以 \(j\) 的数量是 \(O(\log n)\) 级别的。用 bitset 优化 dp,时间复杂度为 \(O(\dfrac{n^2\log n}{w})\)

#08 CF1481F

题目传送门

首先,我们思考答案的取值范围。

我们约定树中深度最大节点的深度为 \(mxdep\)

先考虑下界:考虑如果每一层的节点的字符串都一样,那么显然答案就是 \(mxdep\)

再考虑上界:我们考虑在 \(i\) 层时,此时我们还剩 \(x\)a,且还有 \(m\) 个点还没有上色,且该层有 \(sz\) 个非叶子节点。因为每一个非叶子节点有至少一个儿子,那么有 \(sz \le \dfrac{m}{2} \le \max(x,m-x)\),因此我们总可以给该层所有非叶子节点上同一种颜色。所以不同色的节点只可能出现在叶子上,生成且仅生成一个新字符串。因此答案上界为 \(mxdep+1\)

那么我们考虑什么时候取到 \(mxdep\)。我们对每一层的节点个数 \(sz_i\) 做背包,如果背包满了,那么就可以取到下界。这个背包是 \(O(n^2)\) 的,不可做。

但是有一个 Trick:因为节点数量不同的层数至多为 \(2\sqrt n\),我们可以把节点数量相同的层合并做分组背包。

但是构造方案并不是那么简单。

如果取到上界:那么构造就参考证明,对于每一层,给它上剩余数量较多的颜色,且优先给非叶子节点上色;如果上色时出现当且颜色没了,那么就换一种颜色上即可。

如果取到下界:那么我们考虑换一种 dp 形式:我们定义状态 \(f_{i,j}\) 表示考虑了前 \(i\) 小的物品,且物品总体积为 \(j\) 时,取第 \(i\) 种物品前的物品总体积。转移类似;特别地,在取物品时,我们需要通过第 \(i\) 种物品的总体积来判断是否超过了限制。而且,贪心地,我们在转移时应当优先不选当前物品(这样后面就可以选更多的当前物品)。构造方案时,通过体积差来判断每一个物品选了多少个即可。

#09 CF1458D

题目传送门

首先,看到“数量相等”这个条件,就考虑通过给 ‘0’ 和 '1' 做一些标记使得两者可以抵消,因此我们选择比较常见的给 '0' 赋值 \(-1\),给 '1' 赋值 \(1\)。我们对权值做前缀和,然后两个前缀和相等的位置就是可以进行操作的区间的端点。

然后就是本题的 Trick:我们把第 \(i\) 个点看做 \(d_{i-1}\) 连向 \(d_i\) 的边(\(d\) 是前缀和)。然后 ‘0’ 和 ‘1’ 个数相同的区间,对应图上一个环,操作就是将环上所有边反向。因为可以反向,所以我们就考虑将有向边看成无向边,然后题目的本质就是让我们求一条字典序最小的欧拉路径。

我们考虑什么时候可以从 \(i\) 走到 \(i-1\):如果 \(i+1\)\(i\) 之间有边,那么 \(i\)\(i-1\) 之间至少有 \(2\) 条边才可以走,因为我们还需要回到 \(i\) 点。

然后贪心即可。

#10 CF626G

题目传送门

首先,我们发现随着投入量的增大,单次投入的收益是减小的。

然后我们据此进行贪心,每次选择收益最大的进行投入。

然后考虑怎么修改。可以证明单次修改至多造成一个投入的变化。

证明:假设修改第 \(i\) 个抽奖箱时已有 \(c\) 张票,若 \(l_i\) 加一后,我们投入了超过 \(c+1\) 张票,那么假设替换的彩票的贡献为 \(w\)

因为之前选 \(c+1\) 张是不优的,所以有 \(p_i(\dfrac{c+1}{c+1+l_i}-\dfrac{c}{c+l_i}) \le w\),那么选 \(c+2\) 张票时有:

\[p_i(\dfrac{c+2}{c+2+(l_i+1)}-\dfrac{c+1}{c+1+(l_i+1)}) \le p_i(\dfrac{c+1}{c+1+(l_i+1)}-\dfrac{c}{c+(l_i+1)})\le p_i(\dfrac{c+1}{c+1+l_i}-\dfrac{c}{c+l_i}) \le w \]

因此我们至多改变一张票。

接下来就是数据结构乱搞了。

posted @ 2025-10-09 21:29  XiaoZi_qwq  阅读(7)  评论(0)    收藏  举报