CF 1039 Div.2 解题报告

A(800)

题意:给出 \(n\) 个数,每次选择一个不大于 \(x\) 的数,然后将其他数乘二,询问至多操作几次。

贪心证明是容易的。

B(1100)

题意:给出一个长度为 \(n\) 的排列,每次可以从左或从右选出一个数加到新数组末端,请构造方案使新数列中没有长度为 \(5\) 的上升序列或下降序列。

我们可以只关心相邻两个数的大小关系,考虑如果相邻的四个数前两个上升后两个下降,那么肯定没有非法情况。重复构造这种情况即可。

C(1200)

题意:给定一个长度为 \(n\) 的数组,初始时所有元素都是 \(0\),你可以下述操作任意次:选择一个数 \(x\) ,找到第一个 \(i\) 使得 \(a_i\) 小于 \(x\),然后 \(a_i \leftarrow a_i+x\)。问能否将原数组变成目标数组。

容易发现我们只能从前往后处理每一个位置。假设我们目前处理到了 \(i\),且前 \(i-1\) 个数的最小值为 \(mn\)。显然,我们每一次操作都不能大于等于 \(mn\),所以我们至多进行一次 \(x=mn-1\) 的操作,和一次 \(x=mn\) 的操作。所以如果 \(a_i \ge 2mn\),那就无解了。

D(1600)

题意:给定长度为 \(n\) 的排列 \(a\),保证 \(\min(a_i,a_{i+1}) \ge a_{i+2}\)。求出所有子序列的 LDS 的长度和。同时你只能使用线性复杂度的算法。

稳定发挥(确信)。

明显是 dp。(因为转移简单,只需要向前找两个位置;而且 LDS 看起来就很 dp)

我们令 \(f_i\) 为以 \(a_i\) 结尾的 LDS 个数,\(g_i\) 为以 \(a_i\) 结尾的 LDS 长度和。

转移就分类讨论:

  • \(a_{i-1} > a_i\):那么所有以 \(a_{i-1}\) 结尾的 LDS 都可以向后扩展一次,同时 \(i\) 自己也可以开启一个 LDS。所以有 \(f_i \leftarrow f_{i-1}+1, g_i\leftarrow g_{i-1}+f_i\)。这里我们不考虑从 \(i-2\) 处的转移,因为了来自 \(i-2\) 的转移已经在 \(i-1\) 转移时考虑到了。(看完下一部分后,通过分类讨论读者不难自证)

  • \(a_{i-1} < a_i\):那么所有以 \(a_{i-2}\) 结尾的 LDS 都可以向后扩展一次,同时 \(i\) 自己也可以开启一个 LDS,并且 \(i-1\) 开头的子序列如果包含 \(a_i\),那么它的 LDS 也一定以 \(a_i\) 开头。因此有 \(f_i \leftarrow f_{i-1}+2, g_i\leftarrow g_{i-1}+f_i\)

答案就是 \(g_i\) 的和。

E2(2600)

题意:简化不了,自己看吧。CF2128E2

先看部分分:找到最大的次中位数并给出区间。

关于中位数的一个很典的 Tirck:找到一个区间内的最大中位数,只需要二分判断 \(x\) 时:构造一个 \(b\) 数组,其中若 \(a_i \le x\),那么 \(b_i=1\),否则 \(b_i=-1\)。求出区间最大子段和是否大于等于 \(0\) 即可。

这个题一模一样,只不过在求最大子段和时要保证子段长度不小于 \(k\) 即可。

找到区间容易的。

然后再看这道题:

对于一个长度为奇数 \(n\) 的区间,其第 \(\frac{n}{2}-1\),第 \(\frac{n}{2}\),第 \(\frac{n}{2}+1\) 小的数分别为 \(l,mid,r\)。此时如果:

  • 我们加入一个小于等于 \(mid\) 的数,那么新区间的次中位数的取值范围为 \([x,mid]\)。(我们不关心 \(x\) 的取值)

  • 我们加入一个大于等于 \(mid\) 的数,那么新区间的次中位数的取值范围为 \([mid,x]\)。(我们不关心 \(x\) 的取值)

我们发现它肯定是包含原区间的次中位数的,且原区间的次中位数一定为取值范围的一个端点。

考虑从一个长度为奇数的区间 \([l_1,r_1]\) 通过移动两次端点变成另一个长度为奇数的区间 \([l_2,r_2]\)(移动指将其中一个端点减一或加一)。我们可以将这个过程理解为:\([l_1,r_1]\) 加入一个数,\([l_2,r_2]\) 加入一个数,并且操作后两个区间相等(我们称操作后的区间为“过渡区间”)。

我们设 \([l_1,r_1]\) 的中位数为 \(mid_1\)\([l_2,r_2]\) 的中位数为 \(mid_2\)。由上述结论我们可以得出:过渡区间的次中位数取值范围为 \([\min(mid_1,mid_2),\max(mid_1,mid_2)]\)。也就是 \(mid_1\)\(mid_2\) 中的所有数都可以在过渡区间内做次中位数。

长度为偶数的区间变成长度为偶数的区间这个过程中次中位数的变化情况留给读者自行分析。(没分析也没关系,结果就是符合下述结论)

通过上述证明我们可以得出:如果中位数从 \(mid_1\) 变为 \(mid_2\),则 \(mid_1\)\(mid_2\) 之间的所有数都可以做次中位数,且一定可以在初区间移动到末区间这个过程中访问到对应的区间。

那么通过部分分我们已经会求最大和最小的次中位数及其对应区间,那么我们只需要模拟移动区间这个过程,然后能构造次中位数及其区间就构造就行了。

(Tip:因为你需要保证区间时刻不小于 \(k\),因此你需要先扩大区间再缩小区间)

F(3200)

题意:给出一个 \(n\) 个点 \(m\) 条边的无向连通图,第 \(i\) 条边的边权范围为 \([l_i,r_i]\)。你需要给每一条边在其边权范围内分配一个边权,使得 \(dis(1,n) \neq dis(1,k)+dis(k,n)\),其中 \(dis(u,v)\) 表示在当前边权分配情况下 \(u\)\(v\) 之间的最短路。

3200 当之无愧。

首先,看到这种范围的题目,应该先想是不是只需要取最值。

你需要知道一个事实:\(dis(1,n) \le dis(1,k)+dis(k,n)\)。我们考虑如果存在解,那么我们给 \(1\)\(n\) 最短路上任意一条边的边权减一,那么 \(dis(1,n)\) 减一,\(dis(1,k)+dis(k,n)\) 至多减一;我们给除 \(1\)\(n\) 最短路上的任意一条边加一,那么 \(dis(1,n)\) 不变,\(dis(1,k)+dis(k,n)\) 至多加一。因此以下方案一定满足条件:\(1\)\(n\) 的最短路上的所有边的边权取最小值,其余边取最大值。

然后你要想:\(dis(1,k)+dis(k,n)=dis(1,u)+dis(u,k)+dis(k,v)+dis(v,n)\),其中 \(u,v\)\(1\)\(n\) 最短路上的两个点,且 \(u\)\(v\) 之前被访问。那么我们只需要维护 \(mn_u= \min_{i \text{在}u\text{前被访问}}(dis1(1,i)-dis2(i,k))\) 的最小值,其中 \(dis1(u,v)\) 表示 \(u\)\(v\) 全部使用最小边权时的最短路,\(dis2(u,v)\) 表示 \(u\)\(v\) 全部使用最大边权时的最短路。如果存在一个点的 \(mn_u\) 小于 \(dis2(u,k)\),那么这个点就不能走(因为肯定存在方案使得 \(dis(1,n)=dis(1,k)+dis(k,n)\))。

关于这部分我极力推荐去看官方题解的理解方式,非常形象直观。

posted @ 2025-09-05 21:09  XiaoZi_qwq  阅读(4)  评论(0)    收藏  举报