shu-jia
暑假
NOIP2023模拟测试赛(一)
A
每个数出现 次,可以容斥:
钦定 个数出现 次,减去钦定 个数出现 次,加上钦定 个数出现 次,...
钦定 个数出现 次怎么算?假设它们是前 个数(最后乘上 )。
如果是全出现一次,则可以把这 个数划分成若干集合,每个数都被划分且每个集合都有数。
这个方案数就是斯特林数 , 是枚举的集合数量。
如果允许有出现 次的,那这些 次的数再放进一个集合。注意这个集合可能没有数,不符合斯特林数的定义,
那就再假设有一个数,提前给它放到这个集合中。方案数就是 。
我们还需要考虑剩下 个数。这些数在已经选好的 个集合中可以任意出现,
有 个位置,每个位置可以选择出现或者不出现,方案数即 。
除此之外,还有一些集合可以被选择,那就是不选前 个数的集合(前 位均为 )。
这些集合无所谓选不选,对前 位无影响。它们的选择方案数是 。最后答案为
直接计算,复杂度 。
B
先假设全树选择次数均为某个数 。我们每次可以选择一棵非全树的子树 ,把这棵子树选择次数加 。
那么会导致答案加了 ,总重量加了 。
现在变成这么个问题: 个物品, 作为体积, 作为价值,物品 有无限个,其他物品有 个,求体积上限内最大能得到的价值和。
这是一个多重背包,可以二进制分组解决。可是 太大,过不去。
考虑一个错误贪心:把所有物品按性价比 从大到小排序,从大到小能选就选。
这个贪心什么时候正确?若 ,我们可以把 个物品 替换成 个物品 ,因为它们的价值均为 ,但前者体积为 ,大于后者体积 。
这意味着排完序如果性价比偏低的 个数大于性价比偏高的 的 ,且 还能放(个数少),可以把 替换掉。
注意到 。所以说,大范围里我们可以贪心,小范围用背包解决即可。
具体地,每个物品拿 个出来多重背包,之后枚举每一种权值对应的最小体积,剩余体积贪心分配。
这里由于体积大,权值小,背包的状态要换一下,不再是一定体积能装的最大权值,而是一定权值需要的最小体积。
复杂度 。
C
根据幻想乡战略游戏的经验,权值由一个点从小到大向外发散。
什么,你问我证明??听说是凸函数相加仍为凸函数,我不太懂!!
还是套路点分,但不同于 P3345,这里 dis 带了个 的指数,不能直接点分树维护。
也不能每次爆搜 ,万一度数很大就完蛋了。
于是使出所谓的凸函数的神秘方法,假设答案不在点上而在边上,考察只有两个点的情况:
这是一个关于 的下凸函数,它可能有以下三种姿态:
第一种,说明最优点在边上。那么 两点中有一者是答案。
第二种,说明从 走到 答案不断减小。那么就往 走吧。
第三种,说明从 走到 答案不断增大。那么不应该往 走,考虑其他儿子吧。
我们发现, 的正负性可以判断出要不要走到 (不管第一种,我们实时更新答案即可。)
这个可以从 出发,一次 dfs 预处理得到。于是就不用 dfs 每个 了,解决了最大的问题。
复杂度 。
NOIP2023模拟测试赛(二)
A
先求出最小生成树,记它的权值为 。分类讨论:
-
若 ,显然怎么染权值都不可能小于最小的权值,答案为 。
-
若 ,随便搞出一个最小生成树,设为 。
考虑最小生成树的通用处理,对每条树外边 ,求出它两个端点在 上之间的边权最大值。
设最大值减去边权的值为 ,显然 ,否则就不是最小生成树了。
如果我们把当前的树染成同色的(设为黑),那我们要保证其它最小生成树中有异色的。
其他的最小生成树一定是由一些 的边替换掉一些当前树的边得到的。设这些边数量为 ,
则这 条边中一定有至少一条白色的。其他边怎么染都无所谓,不会出现在最小生成树中。
方案数即 。(2 表示树是黑还是白)
如果我们把当前的树染成异色的,那已经满足条件,剩下边随便怎么染都行。方案数即 。
- 若 ,还是搞出一个生成树,求出 。
由于 ,这棵生成树只能染同色,设为黑色。树外边会分成三类:
1.。这些边如果替换进来,生成树权值还是小于 ,因此它们必须全部染成黑色。
注意这里不存在替换两条的情况。替换两条的权值大于替换一条,如果替换两条可行,其中至少有一条白色的,如果直接替换这一条,生成树权值应该小于 ,不符合题意。
2.。这些边替换进来刚好权值是 ,它们之中应该至少有一条白色的。
3.。这些边替换进来不影响答案,随便怎么染都行。
设 表示第二类边数量, 表示第三类边数量,方案数即为 。
B
在哪个位置都一样,不妨设他在第一位,最后答案乘上 。
现在简单来说, 想赢,要满足 这些数中没有出现 中的数。
考虑容斥,设上述分组完的 min 分别为 。求出 表示 中包含的 全都在 中的方案数( 是由若干 组成的集合。)
答案即为 。如何求出 ?考虑 dp,设 表示只考虑前 大的 时的 。
转移:每多一个更小的 ,我们可以继承之前的状态,即 。
也可以考虑新开一个集合,令其中最小值为 。即
这里枚举了新的集合 ,乘 是因为第 个集合大小就是 , 放哪里都可以;
乘 是考虑剩下 个位置放的数,这些位置只要放大于 的数即可。
可选的数的数量为 ,还要减去 的原因是要减去之前在 中已经放过的数的数量。
由于 从大到小转移,这些数一定全部大于 。所以不会算重也不会算漏。
实现时, 就是枚举二进制数时的 。复杂度大概 。
C
考虑 dp。设 表示前 位划分的方案数。
转移考虑枚举最后一段的左端点,如果这一段出现一次的数数量 则可以转移。
这样是平方的。考虑数据结构优化,转移到 时维护数组 , 表示 出现一次的数数量。
向右移动一格到 时,设 ,则将 的 加 , 的 减 。
这里 表示上一个 的位置, 表示上上个 的位置。
现在问题变成,区间 加减 ,求 位置的 的和。
考虑分块,虽然教主的魔法只能根号log,但这题有特殊性质:每次加减的数为 ,且每次都是查询 。
考虑每块内维护桶,修改时整块打上标记,因为只加减 ,答案可以根据桶 维护。
散块直接重构,重构时也可以顺便维护答案。这样就做到了一个根号。
复杂度 。
NOIP2023模拟测试赛(三)
A
一个括号序列合法,当且仅当我们把 (
设成 ,)
设成 ,满足设出来的序列所有前缀和 且总的和为 。
这里,我们建出 SAM。为了在 SAM 上方便处理,把上述检验中所有前缀变成后缀, 和 交换一下。
SAM 中每个节点表示了一些本质相同的字符串。维护每个节点 中任意一个结束位置 。
设这个节点代表的子串的左端点区间为 。固定子串的右端点,左端点越向左,越难以满足“所有后缀和 ”的条件。
我们可以用 st 表 / 线段树二分等数据结构,或者单调栈,对数时间或均摊 的复杂度内二分出这个临界点 。对于右端点在 的子串,若它的左端点小于等于 ,则这个子串一定不合法。
如果 ,那么这个节点代表的子串都是不合法的。否则令 。
现在要求的是,右端点在 ,左端点在 的所有子串中有多少个和为 。(赋值完 , 之后)
设序列的前缀和数组为 。也就是求 内有多少个 满足 。
随便搞,扫描线可以做到线性。
最后复杂度线性对数,或者精细的话线性。
B
C
神题
环上不会有相邻的两个 的数。假设 的数称作大数,否则称为小数。
那么整个环的构成有两种可能:
如上,红色代表大数,蓝色代表小数。
第一种情况下,整个环大小数交替。
第二种,整个环可以从每两个小数之间断开,变成若干链。
我们先研究第二种如何计算。设 表示长度为 的序列,在 下大小数交替,以小数开头小数结尾的方案数。
求出序列 的 OGF ,则把这些链拼成长度为 的链的方案数即
设 , 各项系数为 。这里拼的是环,我们要拼的是链。考虑断环为链,如果:
-
之间的断点没有链覆盖,则方案为 。
-
否则有一条链跨越 之间,枚举它的长度 ,则方案为 。(断点有 种可能,这条跨越的链有 种可能,剩下是长为 的链)
下面来求 。有一个很神的转化,把 中大数全部减去 ,剩下的相邻两项之和小于 。
而且这两种方案一一对应(可以想象一下)。
设 表示长度为 的序列,相邻两项之和小于 的方案数(原问题去掉环。)
那么因为一一对应,有 ()。
现在让我们求 。像环一样,考虑把序列从两个小数之间断开。与环不同,头尾两段的序列不一定要小数开头小数结尾,而开头一段可以大数开头小数结尾,结尾一段可以小数开头大数结尾。
考虑设 表示长度为 的序列,在 下大小数交替,以大数开头小数结尾的方案数(可以为空)。
大数开头小数结尾的方案显然是一样的。设 为 的 OGF,则答案的 OGF 为 。
这里漏掉了一种情况,和环一样可能只有大小数交替没有可以断开的地方,且大数开头大数结尾。
我们令小数加上 ,大数减去 ,则这就变成了先前 定义的方案(小数开头小数结尾,大小数交替)。
于是答案的 OGF 应该是 。
剩下还有环的第一种情况,即整个环大小数交替。还是将大数减去 ,这变成一个 的原问题。
递归解决即可。这里将 的子问题还原回原问题有 种方式,奇数位加 或者偶数位加 。
每层做一个求逆,共有 层,复杂度 。
NOIP2023模拟测试赛(四)
A
在每个数出现次数不变的规则下,所有序列都可以转化为以下两种序列之一:
证明,设最大的数为 ,考虑每个数 的出现次数 。
我们有 (除了 ),因为每个数都由 或 走来,一个 对应一个 或 。
那么从小的到大的像这样折线放,每放一个 就跟放一个 ,直到 不够了就走上面,一定可以涵盖所有情况。
第二种和第一种差不多,我们最后把 减一再算一遍就可以得到第二种。来看第一种。
把每个数最后出现的位置标出来(图中红圈)。会发现剩下的点可以被两两匹配(图中蓝色短线划的线段)。
枚举所有数的最大值 ,以及序列长度 。那么除去红点共有 组短边。
这些短边要被分配到 组里。插板一下就是 。
列个式子
直接计算即可。
B
要求字典序比它小的矩阵个数,考虑求某个位置之前都是一样的,当前位置小于原矩阵,剩下合法随便放的方案数。
如图,蓝色、紫色、粉色部分都一样,红色格子是决定字典序的格子,黄色、橙色随便放。(满足错排)
设红色格子为 ,设它最后填了 。
首先需要满足 。其次, 不能在红色区域出现过。
然后,还要求出黄色部分的方案。具体地,假设黄色还能选的数集合为 ,紫色的 构成的集合为 ,
求出 表示共有 组物品匹配,有 组需要满足错排限制,剩下 组不需要的方案数。
初始:。 是错排方案数,有 。
然后呢,黄色部分的方案就是
。
现在我们要对每种可能的 求出 和 。
事实上,枚举 只会导致 中一个数的变动,不会导致 变化。
考虑 的变化。如果 取到了 中的数会让这个值 ,否则不变。
那么现在要求不在粉色区域的,且在紫色区域的,且 的 有多少个。
取到这些数时会使 少一个数。最后分成两类算即可。
这个 的数量可以考虑维护树状数组,向右移动时顺便维护一下即可。
复杂度 。
C
LIS,LDS 最多只有一个交点。将每个点表示为 ,能找到不相交的 LIS,LDS 当且仅当:
序列中存在下标 ,满足 是 LIS 中相邻两项, 是 LDS 中相邻两项,且位置、大小满足下图关系:
即 。
充分性:显然以上情况,选取包含 的 LIS,包含 的 LDS 即为答案。
因为 是相邻两项, 也是,所以 LIS,LDS 不会有交点。
必要性:如果存在答案,将 LIS,LDS 中相邻点连线。很显然这两条折线会相交(否则有更长的 LIS / LDS)
假设相交的两条线段,LIS 的端点为 ,LDS 的端点为 。如下图。
将平面分成了九块。中间一块一定没有点,否则 不是相邻两项。
设 。则 可能在左上角一块,正上方,正左方,左下角或者右上角。
看看左上角。那么 可能在下方,右下角或者右方。
如果在下面,你发现 构成了下降子序列,与 在 LDS 中相邻矛盾。
在右边同理,右下方更是使 都可以插到中间。
类似地讨论 在其他地方。我们会发现,只有 上 下或者 左 右满足条件。
这两种情况是对称的。至此必要性也证明完毕。
回到这个具有充要性的图。我们现在要做的是,求图中是否存在这么一个结构。
没有的话无解,有的话找一个出来。
注意到求 LIS 的时候,每个 对应多个 。这些 的排列一定按图中箭头方向。
(越右上的 dp 值一定越大,可以从左下的转移而来)
而 越往右,合法的 只会变多。所以我们对每个 求对应的最大的 ,设为 。
同理的,每个 对应一些 ,而这里 越大越能满足条件。因此我们对每一个 维护最大的 ,设为 。
那么对于每一组 ,要求满足 的 的 最大值,看看最大值是否大于 。
如果大于 则这组 合法。这个简单扫描线,线段树维护最大值即可。
复杂度线性对数。还有,实现时求对称的结构可以直接反转数组再做一遍!/qiang
NOIP2023模拟测试赛(五)
A
把值域分成若干段。暴力 dfs 每个数在哪一段。
然后暴力枚举每个数的大小关系。可以求出 LIS 长度。
然后求概率。随便算,长得像一个插板。
复杂度魔幻。 且跑不满,基本怎么写都能过。
B
考虑 dp: 表示前 个灯笼能照亮的最长前缀。
转移,考虑看第 个灯笼向左还是向右。
如果向右,那么 一定都是照亮的(才会更长)。
若 ,。否则 。
如果向左,只需要 被照亮。
找一个最小的 满足 。那么 全部可以向右,转移即
考虑方案如何求。反向推,如果当前 dp 值由向右得到,则自己向右,走到 继续推。
否则自己向左, 全部向右,走到 。
复杂度线性对数。
C
即求权值前 大的区间之和。考虑二分,求第 大过程中求出这个和。
设二分的值为 ,要求有多少个区间的权值大于等于 ,以及这些权值的和。
考虑扫描线扫 。 越大 的权值最小。所以可以双指针。
区间的权值如何快速计算呢?考虑对于每个小的区间 ,把数轴上 赋值为 。
那么扫到 的时候查询数轴上有多少个 的数即代表 的答案。
考虑颜色段均摊。那么要维护前 大的和,考虑 向右移对所有 的影响:
覆盖 ,把其中的颜色段提取出来,每段都变成了 。
假设这段原先是 ,长度为 ,则 的权值都会加 。
总共 次区间加。注意到权值随着 增加而减少,区间加完也是减少的。
区间加考虑差分,设 ( 为权值),则 加 等价于 加 , 减 。
设双指针前面的指针为 ,满足 ,且 最大。
那么在对权值区间加时,如果区间加的左端点 在 左侧,直接计算多出来这段对和、权值的贡献。
否则打上差分的标记,等 走到右边的时候再计算贡献。
至此复杂度 。但注意到每次 ODT 执行的操作是一模一样的,可以在二分前先搞好这些操作。
二分时直接调用转换后的颜色段均摊操作,复杂度即为 。
NOIP2023模拟测试赛(六)
A
果然是 braintest。有点智障
这个强制在线有明显的漏洞,你发现 lst 会一直是 ,之后某次询问后一直是 。
假设变成 的询问序号是 ,那么 的询问都没被加密。
我们假设一个 ,如果操作完 图不连通,说明真正的 在这个 之前(或等于)。
那么可以二分,每次暴力删边 check,复杂度线性对数。
此题存在线性做法,具体地改删边为倒序加边,并查集判断是否连通。
B
考虑 的解。我们把矩阵黑白染色, 填黑,黑格填上所在行数,白格填上所在列数 。
例如 ,如下:
考虑优化,我们先搜索得到一个 的好矩阵,如下:
这里这个矩阵不仅满足原有限制,我们将它横向或者纵向循环移位都会得到好的矩阵。
还是将原矩阵黑白染色,然后我们用上述矩阵拼成一个大矩阵,把黑格子的数加上所在行除以 乘 ,白格子的数加上所在列除以 乘 。假设加的这些数称为额外数。
为什么这样是对的?考虑如果存在两组相同的相邻格子,它们上面黑白格子所加的额外数一定相同。
减去这些数,在原来的 矩阵中就会出现两组相同的相邻格子,这与假设矛盾。
因此这样构造一定是对的。
C
考虑 kruskal 求最小生成树的过程,每当加入一条边,如果两端未联通,这条边就在最小生成树中。
设对于一个图, 表示只保留边权 的边得到的图连通块个数。
那么从 到 ,减少的连通块个数即为边权为 的边在最小生成树中的数量。
即,最小生成树权值为 。
推一下,即为 。
现在对于这个完全图要求 。
设 , 表示图的点数,即 个点的完全图,保留 的边的期望连通块数。
现在要求的就是 。为了求 还要套路的求一个东西:
设 表示, 个点的完全图,保留 的边,全图联通的概率。
转移 :用 减去不连通的概率,枚举 所在的连通块大小 :
乘 是因为,这个大小为 的连通块不能与其他点有 的边。
转移 :枚举 所在的连通块大小 :
注意到, 是一个关于 的 次多项式。这个可以归纳证明,这里不写了。
同理可以归纳证明, 也是一个关于 的 次多项式。
要求的 就是关于 的 次多项式。
很小,我们可以求出这个前缀和的前 项,然后拉格朗日插值。
复杂度 。
D
参考这个。板子题不解释
NOIP2023模拟测试赛(七)
我出的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现