2023 暑假模拟赛 整理合集

NOIP2023模拟测试赛(一)

Problem A: Everything on It

容斥 + 第二类斯特林数。

容斥的精髓在于“至少……的方案数”。剩下的就是暴力拆分统计方案数了。

Solution. | My Submission.

Problem B: Sweet Alchemy

背包 + 贪心

十足的好题。将背包和贪心融合,让我重新审视学习了一遍背包,理解了性价比排序贪心。

Sol.1 | Sol.2 | Sol.3 | My Submission.

Problem C: Logistical Questions

点分治 + 函数求导

一道大清新题,但是超出了我的能力范围,主要是因为涉及到凹凸函数以及求导,我还不太能理解。

Sol.1 | Sol.2 | My Submission.

NOIP2023模拟测试赛(二)

Problem A: Bichrome Spanning Tree

神仙计数题。最小生成树。

正难则反啊!!“染色方案→最小生成树权值和”转化为“最小生成树权值和→反推染色方案数”。
基本想到这点分讨一下剩下的实现基本没难度。

Solution. | My Submission.

NOIP2023模拟测试赛(三)

Problem A: 括号串(brackets)

后缀自动机。

咕。待填坑。

Problem B: 上升子序列(sequence)

优化树状数组求上升子序列

很好的一道题,但是忘记了怎么去反向思考问题。

My Solution. | My Submission.

Problem C: 数列计数(count)

多项式。

咕。待填坑。

NOIP2023模拟测试赛(四)

Problem A: 山水画

组合数 + Lucas。

想法和我的差不多吧……只不过是使用了分组的方式考虑,但是确实更简便。

我这个数学渣竟然也能和这种组合数学钢出 20 pts,可喜可贺。

Sol.1 | Sol.2 | My Submission.

Problem B: 矩阵

带限制的错排问题

神仙题啊神仙题!!我太菜了压根没看出来是错排。还是带限制的错排。梦回 GDOI2023 Day1T2。

My Solution. | Sol. | My Submission.

Problem C: 序列

朴素 dp + 扫描线。

真的又是一道关于 LIS 和 LDS 的好题。证明结论,构造情况,输出答案。

Sol.1 | Sol.2 | My Submission.

NOIP2023模拟测试赛(五)

Problem A: Random LIS

期望。

My Solution.

Problem B: Lanterns

朴素 dp 好题

My Solution. | A Better Solution.

NOIP2023模拟测试赛(六)

Problem A: 脑测(braintest)

动态判连通性。

很巧妙的一道题。一道假强制在线题。因为没有加边操作,所以一旦不连通之后不论怎么删边都不可能连通了。所以我们可以用 O(n) 倒序判断分界点,使用 sz[] 优化并查集复杂度即可。

Solution. | My Submission.

Problem B: 魔法披风(cloak)

Solution. | My Submission.

Problem C: 折半状压 (seat)

多项式。

咕。待填坑。

Problem D: 奖牌收割机(ecu)

原题:P5540 [BalkanOI2011] timeismoney 最小乘积生成树。这个二创给我创飞了,就没写了,差别很大。

Subtask 3 对我们有很大的启发。将每种方案的贡献投射到平面直角坐标系上,容易发现所有可能是答案的点都一定在下凸壳上。所以我们一步步去维护这个下凸壳即可。

Sol.1 | Sol.2 | My Submission.

NOIP2023模拟测试赛(七)

Problem A: Non-decreasing

构造题。

先思考弱化版:全正或全负时如何处理。做法很显然,顺着或逆着加一遍即可。进一步地,对于构造题,我们一定都是使用通解去做,所以思考如何处理有正有负的情况。容易想到把所有数转化成都为正/负数再去做即可,操作次数是 2n2

My Submission.

Problem B: Smuggling Marbles

虚树 + 树形 dp

首先不同深度的点对答案的影响是相互独立的。所以对每一层的树节点分别考虑贡献,使用树形 dp。但是关键在于这样会被直接卡成 O(n2) 的,所以使用虚树优化,算上每一次构虚树的复杂度,一共是 O(nlogn) 可过。

难点在于实现。实现的时候找相同深度的点集一定一定不要直接 O(n) 遍历!!会被链直接卡成 O(n2)!以及不要使用 memset(f, 0, sizeof f);,要在回溯过程中清零省时。

My Submission.

Problem C: Heidi Learns Hashing

随机化 + 多项式。

实际上是个伪多项式题。可以在正确率较大的时候使用随机化枚举答案。

Solution. | My Submission.

NOIP2023模拟测试赛(八)

Problem A: K Paths

多项式。

咕。待填坑。

Problem B: A or...or B Problem

或运算。

首先 AB 从高位开始的、相同的部分我们可以直接删去不看,简化题目。
根据或的性质,[A,B] 这个区间的数是一定可以取到的。我们只用考虑大于 A 且位数与 A 相同的能取到多少个。设 k 表示 A 的位数,那么显然可以得到 [2k+B,2k+11]。然后思考区间 [2k,A] 能够通过或运算得到多少答案。而这个可以通过巧妙的构造得到。具体见题解。

Solution. | My Submission.

Problem C: XOR Replace

异或运算 + 欧拉回路。

极其巧妙的一道题。我们会发现题目给的操作实际上就是把数拎出来放到另一个位置上,操作之间可以形成一个环。然后并查集维护连通块个数即可。

Solution. | My Submission.

NOIP2023模拟测试赛(九)

雅礼供题。

Problem A: triangle

数学。

根据杨辉三角的性质,这个 x 一定是某个组合数运算的结果。考虑如何枚举组合数。对于 Cnmn 的范围是很大的,而 m 的大小却是有限制的。通过粗略估算,C6030 已然接近/超过 1e18。所以 m 的范围不会超过 35。枚举 m,且在 m10 时可能成为答案的 n 数量过多故考虑二分;而在 m>10 之后 n 的数量减少,可以直接暴力枚举。
注意范围较大在计算乘法的过程中要使用 __int128

My Submission.

Problem B: dfa

自动机。

咕。待填坑。

Solution.

Problem C: permutation

交互。

咕掉,数据出锅了。

Solution.

Problem D: tree

咕咕咕。

NOIP2023模拟测试赛(十)

Problem A: Travel in Sugar Country

神仙六维 dp 训练题。

咕咕咕。

Problem B: 循环移位

SAM。

比较板子的一道题。

Solution. | My Submission.

Problem C: Ascending Tree

左偏树。

事实上 30 分的做法是链上做法,是 BOI2004 Sequence 原题。考虑如何拉到树上去做。其实思路是不难的:从下往上遍历,如果父亲儿子不满足大小关系,就扔到左偏树里,最后会形成若干棵左偏树,而里面的每一个节点都取中位数即可。每一次 while() 循环维护父亲儿子关系直到没有矛盾关系为止。
因为时间效率问题我就直接交了 std……/流汗/流汗

Sol.1 | Sol.2 | My Submission.

NOIP2023模拟测试赛(十一)

这场比赛打的并不理想,原因是:一,错误的时间分配;二,不完善的思考与不正确的做法,离正解还差一些;三,极差的码力。

Problem A: Maze

搜索题。

Solution 难得的写的这么好。
说说我的错误吧。我一开始的想法实际上是正确的,即题目可转化为:任意走两条路径,问最少能重合几个点。但是我后面的想法就全错了。我的做法是找到任意一条最短路径,那么肯定能够保证必经的点一定在这条路径上,然后再一个一个跳,看哪些点可以不经过路径上的点就能到达,这样算上最短路上的路径就存在两种抵达方式了,那么说明这两个点之间的点都不是必经点。
看起来比较通顺也比较正确。但是实际上,我们并不能保证那些无法满足“可以不经过路径上的点就能到达”的点对就一定不可能互相之间没有两条以上的不同路径可达。因为最短路是相对随机取到的,对于最短路我们根本不具有什么性质,根本无法保证最短路上非必经点是否会对统计答案产生影响。简而言之,这个想法是充分的,但并不是必要的。
同时,正解往往是优雅而简洁的。特别是在比较正规的比赛中(大模拟除外)。而今天这场比赛实际上是 2017 年多校的题目。

思维上有漏洞这是正常的,往正解去靠近并努力使自己的做法没有漏洞也正是我们需要锻炼的能力。一道题的正解一定是严谨的,一定是能应对很多种情况都有通解的,比赛的时候发现自己做法解决不了样例(即在处理样例的时候发现有漏洞)就一定要停了!连解决样例都会出漏洞(指在做法上漏考虑了问题或多种情况),证明随手造一个数据都可能卡掉,真正的问题极大概率上可能就是这个做法假掉了!这种时候就算改进了过了样例,也只是浪费自己极多的时间和精力,影响自己的状态,在错解上一去不返是考场上绝对错误的选择。这种时候正确的选择就是放下这道题,赶快把其他题的部分分拿了,如果其他题更有把握就做其他题。不排除你的想法是正解,但是正解本身就考虑极多情况,这种情况下做这道题的得分率和得分代价也是不高的,死磕也是不明智的选择。
再有就是考场上想到正解感觉是对的,即使涉及到的算法自己已经很久没复习有点淡忘了,也要去写!既然是正解那就去写!不要怕写错!不要逃避!

说说正解。
其实,这道题一眼就能看出来找到无向图中的环然后数割点就好了。可惜我太久没写心理上不愿意接受这种做法。
另解就是,运用我的做法的前半部分,我们贪心地选择两条最靠左下和最靠右下的路径计算有多少重复点即可。

Solution. | My Submission.

Problem B: 懒人跑步

状压 + 最短路。

一种全新的状压。其实也是老套路了,取一个合法的最小的数作为模数,然后简化状态使用最短路进行动态规划即可。

Solution. | My Submission.

Problem C: CJB的大作

分治 + dp 或 可持久化 Treap。

简要分析一下:不难发现这个长度是可以预处理的。然后我们发现字符本身并不会被改变,只是位置会被移动而已。所以我们考虑每一次找到这个位置在前面的对应位置然后递归下去求解即可。事实上这道题可以算是一个大致的模拟。

Solution. | My Submission.

NOIP2023模拟测试赛(十二)

Problem A: Subsequence Count

线段树优化 dp 转移。

额照旧说一下我的做法吧,不过这一次水了一点点部分分。我的状态是 fi,0/1,表示长度为 i 且以 0/1 结尾的本质不同子序列的个数。但实际上这个 dp 的转移复杂度是 O(n2) 的。转移的主要思想就是把字符一个一个添加进去,所以复杂度容易爆炸。

正解做法,记 f0/1 表示当前以 0/1 结尾的本质不同子序列的个数。那么就有转移 fai=f0+f1+1。证明:对于前 i1 个字符构成的本质不同子序列,我们一定可以把它们按照结尾的数字是 0 还是 1 把它们分成两类。而对于每一个本质不同子序列,我们给它们全部都同时接上 ai,那么就可以保证所构成的本质不同子序列一定都不同。然后再加上 ai 这个数单个构成的子序列数量 1 即可。
发现这个转移式貌似可以使用矩阵乘法去做。经过简单的思考发现,fai 实际上是和最初的 f0/1 线性相关的。同时,因为题面的形式强烈引导我们去用数据结构去做,显然是线段树。那我们考虑怎么合并区间的答案。结合前面的线性相关,我们可以通过两个子区间的系数关系去计算它们父区间的系数。
image

My Submission.

Problem B: 炮艇大赛之练习赛

二分 + CDQ 分治(最优性转可行性)

好题!好题!
实际上这个 v 值的正负如果明白其简便原理的话可以大大提高代码简洁度——不论是相遇还是追及,除的速度都是 vi+vj。回归正题,我们发现,最终的这个时间其实是最晚被标记的那个人的时间的最小值。看起来这是一个求最优解的问题,但是如果直接上手会发现模拟的代价很大且很难做。考虑转成求可行性。
然后我们就可以二分一个时间 t 了。这算是本题的突破口。然后我们考虑如何判断在时刻 t 时两个点 a,b 是否已经相遇。然后就是一个大分类讨论。具体见下面的图片。
然后我们就可以得到两个判定的不等式。且,这个不等式有两个前提限定条件(不等式):一,da<db;二,如果标记的是 a,那么 wa<wb,反之亦然。然后你会发现这就是个三维偏序。三维偏序的详细解释见下方放的 Sol.2。
image

Sol.1 | Sol.2 | My Submission.

Problem C: 道路建设

LCT + 可持久化线段树。

咕咕咕。

NOIP2023模拟测试赛(十三)

Problem A: 匹配

树形背包 dp。

考场上想出来了。

发现题目的关键点在于给定的是一棵树。也即是说,每个节点只有一条与父亲的连边与若干条与儿子的连边使得它与整个连通块连通。这样实际上很大程度上简化了这道题。我们就可以用树形 dp 来做了,钦定 fi,j,0/1 表示当前第 i 个节点的子树,内部形成的最大匹配数对 m 取模之后余数为 j,且此时 i 是否有被儿子与它的连边覆盖。这个状态考场上思考一下不难得到。
那么转移就很显然了。但是我们发现这道题问的是割边的方案数。所以在转移的时候,如果这条边我们不用,那么这条边的贡献就乘上 2 即可——两种情况:一,割掉了此边;二,在求最大匹配的时候我们并没有选择这条边匹配。
最后使用一个神奇的优化——只枚举一半的 size 进行转移。实现见 wjy's code。
至于证明我也没看懂啊qaq
不然就大力卡常,实现见 zsh's code。

Solution. | zsh's code. | wjy's code.

Problem B: 恐怖分子

CDQ 分治。

这个与众不同的做法,要感谢 dyy 与 szx。
发现旅行者可以走的方向是四周,也就是四个方位,然后查询可行区域的面积。但是个人感觉这个用 KDT 很难做。因为它不仅仅是要查询恐怖分子的分布位置,同时要计算所有恐怖分子产生的面积影响。也就是说我们要遍历所有对当前旅行者可能产生影响的恐怖分子并记录贡献。这个用 KDT 做不了(仅个人向)。
众所周知,CDQ 分治与 KDT 在很多情况下都能解决相同的问题。对于面积问题,CDQ 基于其在偏序问题上的优越性,从写法或者是思考的复杂度难度都比 KDT 要小(个人向 x 2)。所以我们考虑 CDQ 怎么做。
按照天使玩偶(此题很显然与天使玩偶相似)的套路,我们只考虑往右下方向统计答案。最后旋转多次统计即可。
首先按照 x 轴划分递归下去,合并处理贡献的时候,按照 y 轴从小到大排序,遍历。当且仅当对于 x>mid 且是恐怖分子的点,我们考虑它们的贡献;对于 xmid 且是旅行者的点,我们考虑它们分别的答案。所以对于要考虑的恐怖分子,显然它们围出来了阶梯形的、旅行者不可走的面积。对于这个面积,我们使用单调队列维护。而对于要统计答案的旅行者,当且仅当这个旅行者之前遇到过的、y 坐标最大的恐怖分子 的纵坐标 小于 目前右边部分的、最高的恐怖分子的 纵坐标 时,我们需要统计右边恐怖分子对左边该旅行者的贡献。证明显然。统计右边贡献的时候,二分出单调队列维护的、需要统计的面积即可。

Problem C: K匹配

费用流 + 计算几何 + 动态规划。

咕咕咕。

NOIP2023模拟测试赛(十四)

Problem A: 糖果

网络流最小割。

忘记了最小割这个东西了/流汗。
其实很容易就能发现这个东西是个网络流问题。然后简单思考建边就会发现普通的网络流不可做。其中一个问题就是很难限制一个小朋友只选择一种糖数。所以要使用最小割去做。最小割的定义就是割掉代价和最少的边使得源点与汇点不连通。然后做法就是 Solution 中说的:用i.j这点表示给第i个孩子至少j块糖,当这个点属于S集合时所代表条件成立。然后i.j->i.j+1连1000-wi,j,i.m向T连1000-wi,m,S向i.1连inf。如果存在ax-ay>=z,x.k->y.k+z连inf。跑最小割,再用 n×1000 减掉答案。
此处再提一下暴力 30 分做法的要点。注意差分约束中,不管限制的 w 是正是负,都是可做的。而判断无解的情况是当且仅当在跑 spfa 时出现了负环或者是跑完之后存在某个小朋友的糖数不满足大于 1 小于 m。

My Submission.

Problem B: 炮艇大赛之正式赛

堆。

怎么说呢,我在改炮艇大赛之练习赛的时候查到了 zjr lcw 这道题的题解然后读了一遍然后这天考场上就直接写出来了呢
显然有一个性质:每一次碰撞一定发生于相邻两个人(不论追及还是相遇)。同时,因为这是正式赛每位选手一旦被标记直接出局。所以直接用优先队列动态维护每次相邻两个人的距离即可。

My Submission.

Problem C: 整数

多项式。

咕咕咕。

NOIP2023模拟测试赛(十五)

Problem A: 顺丰快递

Floyd + 状压 dp。

真的是一道很显然的状压 dp。简单到无需多说。
一定一定要注意要先用 Floyd 预处理出来两两之间最短路径的长度再去动态规划转移。
否则会莫名出锅。

My Submission.

Problem B: 青蛙

栈/线段树。

简单思考会发现这道题有许多神奇的性质。题解写的已经很好了。

Solution. | My Submission.

Problem C: Grasshoppers

多项式。

咕咕咕。

NOIP2023模拟测试赛(十六)

Problem A: k-transpositions

错排问题 + 组合数。

正难则反问题。我们发现对于所有排列,可以按照错排个数把它们分类。然后再反着用错排推一遍即可。题解写的很清晰。

Solution. | My Submission.

Problem B: k-Maximum Subsequence Sum

线段树维护模拟费用流。

神仙题。

Solution. | My Submission.

Problem C: Circle of digits

二分答案 + 后缀树组。

Solution. | My Submission.

NOIP2023模拟测试赛(十七)

体验感超棒的一场比赛。

Problem A: Bash Plays with Functions

数论(积性函数)+ 动态规划。

没想到吧,全场就两三个人没做出来,我就是其中一个
其实就是根据性质推结论。结论题了算是。

Sol.1 | Sol.2 | My Submission.

Problem B: Delight for a Cat

网络流。很强的建边套路。

其实和 NOI2008 志愿者招募 的本质是一样的,建边都是逼迫着去增广那些限制边,使最后的方案满足所有限制。

然后你可能会说志愿者招募只有一个限制,但这道题有两个限制。
所以我们可以直接把两个限制合并成一个:假设一开始全部睡觉,考虑怎样把一些睡觉改成吃饭,使得方案满足限制。
然后就可以按照志愿者的套路做了。建边看代码手推吧,很妙。
题解太烂就不放了,实在看不懂去志愿者招募那吧。

My Submission.

NOIP2023模拟测试赛(十八)

Problem A: Ship

单调队列优化区间 dp。

GDKOI 原题弱化版。且我们会发现这道题的套路和之前的 Laterns 很像。

首先根据数据分析一波这是 n^2 的。然后一眼 dp。很显然是一个区间 dp。然后注意一下状态设计的不要那么不聪明,sub2 的分数直接设 fi,j 表示拿走 i 到 j 所需要的最少次数即可,最后答案 f1,n。
考虑正解。套路,fi,j 表示用了 i 次运输,左边到 j,右边最左能到哪里。然后发现这个东西浑身都是单调性,所以我们可以直接推一波式子然后用单调队列维护,然后进一步减小常数的话就是发现对于同一个 ij 越大,fi,j 越大,所以搞个变量维护一下每次递增的 fi,j 即可。

题解写的挺好的。

Solution. | My Submission.

Problem B: 最大值问题

FFT。

Problem C: Median on Binary Tree

树形 dp + 标数法。

题目显然给了一堆很特别的性质,但这都是放到后面优化实现用的。
观察到题目要求的这个东西很奇怪,简单思考一下它的本质就可以发现,本质上还是中位数,所以套路标数法,在结合实际问题发现需要最大连通块之和大于 a。最大连通块之和显然用树形 dp 去做。但是 dp 还是要结合题目性质运用结合实际更为简洁的状态设计。
本来是对于每个 a 找到一个 mid 去标数,但这样的复杂度是 nlogn 的,还不包括内部 dp 的复杂度。
考虑优化,观察题目给出来的一堆很特殊的性质。
发现 a 的答案显然是单调递减的。所以我们可以同时顺序枚举 a,倒序枚举 mid。
再运用一下那个二叉树的性质。更改的时候一个点只可能影响祖先,且树高 logn 所以总复杂度 nlogn。

题解还行。代码极其优美。

Solution. | My Submission.

NOIP2023模拟测试赛(十九)

Problem A: Alice and Bob VI

博弈论 + 树形 dp。

猜结论啊猜结论怎么还不会猜结论啊。

博弈,不妨猜想答案就是 -1, 0, 1, 2 中的一个。然后分类讨论一下两个人选择互怼还是逃跑即可。重点还是不要把问题复杂化。题解写的挺好。

Solution. | My Submission.

Problem B: Alice and Bob V

博弈。威佐夫博弈模型。

打表找规律。模型没学。但是可以推出来一个 dp 是否必胜的状态转移式子。水了点分。

Solution.

Problem C: Alice and Bob IV

交互题。最大匹配。

前置题:NOI2011 兔兔与蛋蛋。

没写

Solution.

NOIP2023模拟测试赛(二十)

Problem A: 极差(range)

带修莫队。

服了。我的莫队真的太差了。原题 CF1476G。

做过原题。经典结论是一个序列的不同出现次数不超过 n。用莫队维护这个不同出现次数即可。

Solution. | My Sub1. | My Sub2.

Problem B: crixis 的博客(blog)

李超线段树维护 dp。

原题 CF1830F。

Problem C: 陈年老中药(angry)

分块 OR 主席树维护单调队列。

真就一眼分块了。而且和分块维护逆序对极其像。但是我没想出来怎么做,每日报废。

由 sub2 引导想到预处理所有区间。考虑确定左端点的时候新添加进来一个右端点对答案怎样产生贡献。发现这个点和它前面的单增子序列可以产生贡献。进一步优化就把右端点固定求答案然后再往右推即可。主席树维护。

Solution 1.分块 | Solution.2主席树 | My Sub.

NOIP2023模拟测试赛(二十一)

A 题赛时写挂的暴力没调出来,B 题赛时写的正解也没调出来。好菜。

Problem A: 非洲和尚(hate)

背包。

原题 CF1239E。这种 2 x n 走路线的问题我之前 VP 的时候遇到过。还是 *1300 的 Div.2 B。所以这次我很自信的才对了结论想到的 dp 然后不自信地放弃了。很自然想到了背包,但是我菜到不会给背包加一维继续背包。理论会严重超时,实际上很大程度上跑不满,1.5e9 小视野那种老古董也能跑进 1s。

所以能 dp 的时候直接自信 dp 就对了。

My Sub.

Problem B: 深海石斑(low)

圆方树 + 树链剖分。

原题 CF487E。

考场上想到了正解。但是想出来的是 圆方树 + 平衡树 + 树链剖分(线段树)。所以耽搁了很久不敢写。后面 dyy 说平衡树可以用 set 代替所以就写了。碰到这种图上和环有关的问题很显然能想到用圆方树去做,之后就变成了树上单点修改路径查询的问题,自然使用树链剖分做啊,然后 set 维护每个方点的代价即可。

特别需要注意的细节处理是方点的最小值取儿子们的最小值即可,即便方点的父亲也是方点连通块内的节点,也不去和它取最小值。否则会很麻烦。查询的时候如果 LCA 是方点直接往上再取一个即可。也算一个小 trick 吧。

My Sub.

Problem C: 摩尔宁(Mornēn)

线段树维护区间信息。

原题 CF1172F。

和之前 NOIP2023模拟测试赛(十二)Problem A: Subsequence Count 线段树优化 dp 转移特别像。

这道题也能算是 dp 转移吧……大致就是维护一下对于每个区间,如果最后扫完这个区间 result 减去了 x 个 p,result 的初始值最小为多少。挺巧妙的。上传合并的时候用双指针做,但是需要证明一下单调性,见 Sol.2。

Sol.1 | Sol.2 | My Sub.

posted @   pldzy  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示