NOI 赛前模拟赛题目记录

260619 NOI 模拟赛 A(搜索顺序随机化)

题意

解决一个双方轮流执行操作共 \(2n\) 次,每次操作有 \(2\) 种选择的博弈 NP 问题,\(1\leq n\leq 16\)

题解

直接爆搜的复杂度是 \(O(2^{2n})\),不可接受,考虑随机化搜索的顺序。

具体地,若找到一个后继是必败态,则可直接确定当前为必胜态。

那么,一个必败态的后继期望个数是 \(2\),一个必胜态的后继期望数是 \(1.5\)

考虑连续两轮的期望次数,必败态为 \(2\times 1.5=3\),必胜态为 \((1.5+3.5)/2=2.5\)

则期望复杂度 \(O(3^n)\)

260619 NOI 模拟赛 B\(\max presum_i+key_i\) 刻画,SlopeTrick)

题意

给定 \(n\) 个元素 \((a_i,b_i)\),保证 \(b_{i-1}\leq b_i\),对每个 \(1\leq k\leq n\)\(\max\limits_{S:S\in [1,n]\cap \Z\land |S|=k} V(S)\)

\(V(S)\) 定义如下:

  • \(A,B\) 为将编号属于 \(S\) 的元素取出,按 \(b\) 降序排序后得到的序列。
  • \(V(S)=\max\limits_{1\leq j\leq |S|}\left (B_j+\sum\limits_{i=1}^{j} A_i\right )\)

题解

给定下凸数组 \(f\),每次倒序做 \(f_{i}+x\to f_{i+1}\),则此操作相当于在 \(f\) 的差分数组第一个 \(>x\) 的位置前插入 \(x\),函数仍然保持凸性。

刻画 \(\max presum_i+key_i\) 的经典方法是倒着增量维护。具体地,将 \(b\) 升序排序,令 \(f_{i,j}\) 表示前 \(i\) 个元素选了 \(j\) 个的最小代价,转移:

\[\max(f_{i-1,j},b_i)+a_i\to f_{i,j+1} \]

写成滚动数组的形式,就是倒着做 \(\max(f_{j},b_i)+a_i\to f_{j+1}\)

不难发现,若 \(f_j\leq b_i\),则 \(f_j\) 之后都不会改变。

因此,我们只需要对满足 \(f_j>b_i\) 的后缀做 \(f_j+a_i\to f_{j+1}\),并令第一个 \(>b_i\) 的位置对 \(b_i+a_i\)\(\max\)

考虑 SlopeTrick,固定的 \(f\) 肯定是一个前缀,每次对没有固定的一个后缀执行操作。

为了方便,我们在 SlopeTrick 的时候将最后一个 \(\leq b_i\)\(f\) 视作 \(b_i\),记这个 \(f\)\(f_k\),用堆维护 \(f_{k+1}-b,f_{k+2}-f_{k+1},\dots\) 的值。

每次操作就是往堆里放入当前的 \(a\)。当从 \(b_i\) 扫到 \(b_{i+1}\) 时,根据堆中信息弹出 \(\leq b_{i+1}\)\(f\)。然后因为差分的基准变了,还需要修改堆顶 \(f_k-b_i\)\(f_{k}-b_{i+1}\)(即减去 \((b_{i+1}-b_{i})\))。

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

260619 NOI 模拟赛 C(树的直径刻画,贪心,随机化二分)

题意

给定 \(\{a\}\),进行不超过 \(k\) 次操作,每次选定 \(x\),令 \(a_x\gets a_x-1\),需保证 \(a_x\geq 1\)

最小化 \(\max_{i<j} a_i+a_j+j-i\) 的值。

\(1\leq n\leq 2\times 10^5\),多测 \(T\leq 10\)\(2\) 秒。

题解

本质上是一棵树,树的直径 \(\leq D\) 等价于存在一个点或边使得所有位置距离这个位置的距离 \(\leq \frac{D}{2}\)

为了方便细节实现,进行如下转化,这个转化不是必须的,但是不转化实现会有细节问题:

  1. 将所有 \(a_i\)\(1\),最后 \(ans\) 加上 \(2\)
  2. \(1\) 的基础上,将所有 \(a_i\) 乘以 \(2\),将所有 \(i,i+1\) 之间插入一个空节点,最后 \(ans\) 乘上 \(2\)

转化 \(2\) 可能导致将 \(a_i\) 改成小数,因此可能需要进行处理。

此时直径中心一定在点上,枚举中心位置 \(x\),二分答案 \(lim\),对于 \(x\) 左侧有 \(a_j+x-(2j-1)\leq lim\)\(a_j-(2j-1)\leq lim-x\)。右侧有 \(a_j+(2j-1)-x\leq lim\)\(a_j+(2j-1)\leq lim+x\)。如果 \(x\)\(a\) 所在位置,那么还需要加上这一位 \(a\) 的贡献。

\(x\) 扫描线,左侧右侧分别用数据结构维护 \(a_j-(2j-1)\)\(a_j+(2j-1)\)。查询形如给定 \(w\),求 \(\sum_{y\in DS} \max(0,y-w)\) 的值,可以 BIT 或线段树。这样就做到了双 \(\log\)。可以随机化 \(x\) 的顺序,使用可持久化线段树做到期望单 \(\log\)

容易发现,只要保证 \(lim\)\(x\) 奇偶不同,就不会出现把 \(a\) 改为小数的情况。

实际上不需要保证 \(lim\)\(x\) 的奇偶不同。原因是如果出错,那么所有元素就会全部出错,这一点在 \(x\) 在某个 \(a\) 底下时仍然成立。

因此当出错时,\(lim\) 不变,\(x\) 往顶到边界的 \(a\) 个数非严格最多的方向移动一格,一定不劣。

还需要处理中心在某个 \(a\) 上面的情况。一个显然的事情是,如果中心不在 \(a\) 上,我们不会操作使得中心上移到某个 \(a\) 上,因为操作 \(a\) 更优。

所以最终中心在 \(a\) 上当且仅当开始中心也在 \(a\) 上,那么我们对此情况的最优操作就是操作最大的 \(a\) 连续 \(k\) 次,特判即可。

注意随机二分的进入条件应该是 ck(ans-1) 而不是 ck(ans),后者复杂度多 \(\log\)

posted @ 2026-06-20 18:03  george0929  阅读(22)  评论(0)    收藏  举报