NOIP 模拟赛:2024-10-23

T1:

游戏有 n 个关卡,编号1n,编号i 的关卡的难度是 pi,其中p1,p2,,pn1,2,,n 的一个排列。每一个关卡还定义了一个重要度 di,它的值等于其中前 i 个关卡中的难度最小值,即 di=minj=1ipj

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

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


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

T2:

你有一个数组a1,a2,,an,每次可以选择一个下标i(1in),然后将ai变成max(ai,ai1,ai+1)或者min(ai,ai1,ai+1)
注意这里我们认为数组首尾是相邻的,也就是认为a0表示an, an+1表示a1
问对于每个k=1,2,,m,需要至少进行多少次操作,能将数组里面所有数字变成k?如果多少次都不能则输出1。注意对每个k,问题是独立的。

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

T3:

这数据范围一眼区间 DP。先有个粗略想法:dp[l][r][k] 表示 lr 内,hl,hr>hk> 中间其他 的方案数。

如果 krk1lk+rk+1r,这个状态不可行。否则先 (rl+13k1l+1)l+1k1k+1r1 的数分配好,然后考虑左右内部的方案数。因左右对称只考虑左边,枚举 pl+1k1 内最高的位置,取 dp[l][k][p] 累加即可(当然要求 p 的半径刚好到 lk)。

但是这样是 O(n4) 的。用前缀和可以优化到 O(n3) 获得 60pts。

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

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

T4:

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

之后通过 m 次操作构造了 m+1 棵有根树 G0,G1,Gm,流程如下:

  • 初始,使G0=T1

  • 对于第 i 次操作,通过如下方式从 Gi1 构造得到Gi:

    1. 先选择一个原始结点 ki1kin),并新建一棵和 Tki 一样的有根树 Tbase。每次的ki将会是给定的。
    2. Gi1 复制 n次。对其中第 j 次的复制,将其根结点作为子结点,与Tbase 中的第 j 个结点连边。
    3. 完成连接后,得到新图即为Gi。注意这是一个有根树,Gi 的结点个数为 |Gi|=n|Gi1|+n

简而言之,在Tki的每个结点下挂一个Gi1就是Gi

请对 G0,G1,,Gm ,求出他们的最大独立集的大小。图的独立集是图的点集的子集,满足任意两个点在图中没有直接连边。


神奇的结论题。

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

那么我们求 Gi,只需要关心三个东西:原树的独立集大小、Gi1 的独立集大小、Gi1 的根在贪心情况下会不会选。

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

posted @   FLY_lai  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示