NOIP 模拟赛:2024-10-23

T1:

游戏有 \(n\) 个关卡,编号\(1\sim n\),编号\(i\) 的关卡的难度是 \(p_i\),其中\(p_1, p_2, \dots, p_n\)\(1, 2,\dots, n\) 的一个排列。每一个关卡还定义了一个重要度 \(d_i\),它的值等于其中前 \(i\) 个关卡中的难度最小值,即 \(d_i = \min_{j=1}^i p_j\)

玩家需通关每个关卡各一次,但不按编号顺序,而是根据重要度\(d\)。玩家每一次会选择还没有打过的关卡中重要度最低的那一个,如果最低的有多个则选择其中编号最小的那一个。

现在玩家只记得第 \(i\) 个通关的关卡的编号\(x_i\),其他信息则不记得了。请找到一组可能的难度 \(p\),这样的排列若有多种可能,则找到字典序最小的那一个。


容易发现 \(x\) 必然是若干个递增序列拼起来,而且递增序列是递减的。从后到前枚举每一段递增序列,开头必须是小的,然后尽量大即可。

T2:

你有一个数组\(a_1, a_2, \dots, a_n\),每次可以选择一个下标\(i (1\leq i\leq n)\),然后将\(a_i\)变成\(\max (a_i, a_{i-1}, a_{i+1})\)或者\(\min (a_i, a_{i-1}, a_{i+1})\)
注意这里我们认为数组首尾是相邻的,也就是认为\(a_0\)表示\(a_n\), \(a_{n+1}\)表示\(a_1\)
问对于每个\(k = 1, 2, \dots, m\),需要至少进行多少次操作,能将数组里面所有数字变成\(k\)?如果多少次都不能则输出\(-1\)。注意对每个\(k\),问题是独立的。

对于固定的 \(k\),如果把 \(k\) 标记为 \(0\)\(<k\) 标记为 \(-1\)\(>k\) 标记为 \(1\),发现:答案为 \(-1,1\) 的个数加上 "每一个 \(\pm\) 交替段长度除以二取整" 的和。
线段树维护每个 \(\pm\) 交替段的开头即可。

T3:

这数据范围一眼区间 DP。先有个粗略想法:\(dp[l][r][k]\) 表示 \(l\sim r\) 内,\(h_l,h_r>h_k>\) 中间其他 的方案数。

如果 \(k-r_k-1\neq l\)\(k+r_k+1\neq r\),这个状态不可行。否则先 \({r-l+1-3} \choose {k-1-l+1}\)\(l+1\sim k-1\)\(k+1\sim r-1\) 的数分配好,然后考虑左右内部的方案数。因左右对称只考虑左边,枚举 \(p\)\(l+1\sim k-1\) 内最高的位置,取 \(dp[l][k][p]\) 累加即可(当然要求 \(p\) 的半径刚好到 \(l\)\(k\))。

但是这样是 \(O(n^4)\) 的。用前缀和可以优化到 \(O(n^3)\) 获得 \(60\)pts。

进一步的优化,发现直接记录 \(dp[l][r]\) 表示 \(l\sim r\) 内填,\(l,r\) 默认最高的方案数。转移时枚举 \(l\sim r\) 中间半径顶到 \(l,r\) 的位置 \(k\),然后 \(dp[l][k]\times dp[k][r]\) 再乘以组合数即可。而枚举 \(l\sim r\) 中间半径顶到 \(l,r\) 的位置 \(k\),因为每个位置最多被枚举 \(2n\) 次,这一部分总共 \(O(n^2)\)

如何枚举?如果暴力记录 \(v[l][r]\) 保存所有顶到 \(l,r\) 的位置爆空间。可以在枚举了区间长度 \(len\) 的中途,现场计算两个数组:\(v[l]\) 表示左边顶到 \(l\) 且右端点 \(\ge l+len-1\) 的位置们,\(v2[r]\) 类似定义。

T4:

对一棵给定的 \(n\) 个结点的无根树 \(T\),令 \(T_i\) 为把第 \(i\) 个结点作为根后得到的有根树。

之后通过 \(m\) 次操作构造了 \(m+1\) 棵有根树 \(G_0, G_1\dots, G_m\),流程如下:

  • 初始,使\(G_0 = T_1\)

  • 对于第 \(i\) 次操作,通过如下方式从 \(G_{i-1}\) 构造得到\(G_i\):

    1. 先选择一个原始结点 \(k_i\)\(1\le k_i \le n\)),并新建一棵和 \(T_{k_i}\) 一样的有根树 \(T_{\text{base}}\)。每次的\(k_i\)将会是给定的。
    2. \(G_{i-1}\) 复制 \(n\)次。对其中第 \(j\) 次的复制,将其根结点作为子结点,与\(T_{\text{base}}\) 中的第 \(j\) 个结点连边。
    3. 完成连接后,得到新图即为\(G_i\)。注意这是一个有根树,\(G_i\) 的结点个数为 \(|G_i| = n|G_{i-1}|+n\)

简而言之,在\(T_{k_i}\)的每个结点下挂一个\(G_{i-1}\)就是\(G_i\)

请对 \(G_0,G_1,\cdots,G_m\) ,求出他们的最大独立集的大小。图的独立集是图的点集的子集,满足任意两个点在图中没有直接连边。


神奇的结论题。

首先树的不带权独立集是可以贪心的。 自底向上即可。

那么我们求 \(G_i\),只需要关心三个东西:原树的独立集大小、\(G_{i-1}\) 的独立集大小、\(G_{i-1}\) 的根在贪心情况下会不会选。

对于 \(T_i\)\(i\) 会不会选,可以换根 DP,求出 \(cnt[i]\) 表示以 \(i\) 为根贪心,\(i\) 的儿子有多少个选了。

posted @ 2024-10-29 15:18  FLY_lai  阅读(59)  评论(0)    收藏  举报