2022 省选题目合集
两个月前就准备写的东西鸽到现在才写。
打 * 的题目是我觉得题目/做法比较有意义的。其它的题目因为做法和大家差不多可能会写的比较简略。
UPD:写完了。
镇楼图:
jsoi d1t1 预处理器
模拟即可。
jsoi d1t2 填树
感觉弱于 noi2019d1t2。
首先 ,可以转化为钦定所有值在一个长度为 的区间减去钦定所有值在一个长度为 的区间。
然后你就得到了暴力 dp, 表示子树,的度为,填的值在 中的答案。
用 noi2019d1t2 的方法维护关于 的分段函数即可。
第二问算 初值的时候需要进行一些复杂的讨论和手算二次函数。
jsoi d1t3 学术社区
主要思想是首先贪心选性质 C 的东西,然后对两边分别跑性质A,用网络流处理两边之间的匹配。
首先考虑性质 A 怎么做。对于一个入度小于出度的点,我们必定要让多出来的出度失配。考虑添加虚点 ,通过和 连边让每个点入度和出度相等。然后跑欧拉回路,则失配的边正好就是上面给出的下界。
接下来考虑性质 C。我们发现一条边可能在一个方向上寄了,但它可以为另一个方向提供一个点。这是一个匹配的形式,可以直接网络流。
最后就是发现对于一对不满足性质 C 的边,把它们贪心匹配起来一定优,于是转化为性质 C。(我考场上把这个结论猜反了,认为这样一定不优。不过反正没时间写。
jsoi d2t1 卡牌
大小质数分开做即可。
jsoi d2t2 序列变换
之外的部分直接每次贪心删最大的即可。
首先把题意转化为一条链,从左往右扫,在每个位置插入一些数,然后删除一个数。代价为 。特别的,最后一个位置没有代价。
我们发现如果最后一个位置有代价,那么每次删掉最大的数就行了。那我们枚举最大的数是什么,剩下的策略就是每次删掉最大的数,于是有了一个平方的做法。
发现我们的集合大小有一个性质,就是前一半不降,后一半每次减少。于是当集合大小首次大于时,就只会在最后减到。考虑若剩下的数在首次大于之后,那它对中间的代价没有影响,直接选这部分中最大的即可。若在首次大于之前,前面的代价显然是和减去它,直接找这部分中最大的即可。于是只要做 次。
jsoi d2t3 最大权独立集问题
首先这个过程是 csp2019d1t3,直接考虑设 表示在 的子树, 走了 这条边,走了 这条边的点最终到了 的最小代价。转移时手动枚举所有可能的情况,然后根据式子优化即可。
zjoi d1t1 树
考虑容斥,钦定一些点在两棵树中均为叶子。这样的点有两种贡献方案,所以对容斥系数的贡献是 。
从小往大 dp。表示前 个点,第一棵树在 前面的点中有 个非叶节点,第二棵树在 后面的点中有 个非叶节点。转移时分为钦定是第一棵树的叶子,钦定是第二棵树的叶子,钦定在两棵树中均为叶子即可。
zjoi d1t2 众数
根号分支。两个数均为小数的时候算出每个小数向左跳 到 步会跳到哪里。一大一小的时候枚举大数 dp 即可。场上把若干个 写成了 ,挂大分。
zjoi d1t3 简单题
属实是简单题。场上一直以为题面中的性质没有作用,到最后 30min 才发现这个性质是有用的。
性质等价于每个点双是杏仁。发现这个之后直接建圆方树讨论一下杏仁上两个点的答案即可。存在直接缩广义串并联图的做法。
zjoi d2t1 面条
首先暴力模拟 次,缩长度为的次幂的连续段。差分。发现假如原序列形如 AAAABBBBBB,那么一次操作后会形如 AAAAAAAABB,即 A 长度翻倍。设差分序列为,如果我们写出一个长度为的序列,那么每次操作相当于给它复合一个置换。
先计算出 。找出每个环,在上面循环卷积即可得到这个环的答案。最后就是合并环,然后使用类似线性筛的东西合并,复杂度为 。经过暴力, 可以卡到最大,大约是 。但不一定存在数的 是这个数所以卡不到。(
*zjoi d2t2 计算几何
终于有个带 * 的题了。(
前置知识:zloj449B 冰墩墩。
前置知识的做法:
考虑一行一行观察。每一行转移到下一行后,会增加【两行点数差】个向下凸出的三角形,且每个三角形的位置在上一行两个编号相邻的三角形之间。这一点和 zloj534B 菱形覆盖 是一样的。
于是问题转化为不相交路径计数,直接 LGV 有 80 分。考虑一组不相交路径对应一个杨表,但这里的杨表比较特殊,它行列都是不严格的。这个东西的填数方案为,其中为值域。枚举即可。
考虑这道题:
首先打表可以得出第一问答案是 。
第二问和前置知识的做法类似。考虑两行两行推,每次上面一行的总点数固定,下面一行的总点数固定。也是考虑前一个两行对后一个两行的影响是点要在上面两个之间的形式。转化为不相交路径计数。最终答案和前置知识一样。
(场上没特判退化成平行四边形的情况,挂大分了。
(感觉我写得不够理性,毕竟我做这两题的时候很多东西都是猜的。
*zjoi d2t3 深搜
与 djq 讨论后得到了一个不需要 DDP的 1log 做法。
前面奇奇怪怪的预处理就不讲了,这个问题相当于要你算 。其中是矩阵。支持单点改 (这里不是任意修改,任意时刻父亲为同一个点的 A 一共只有黑点和白点两种取值)。
考虑自顶向下 dp。我们记一个矩阵 表示 号点在 时刻的答案。我们上面的做法时求出了这个矩阵每一列的和。
我们最终的答案是每一列的和的一个线性组合。我们考虑换一种求的东西,求每一行的带权和(这个权是对应列的系数)。对应到这个问题上,就是对每个点求它所有时刻的 dp 值的带权和。
考虑从顶向下拿主席树维护,主席树的下标是时间,值是当前点的 dp 值。
考虑一个点如何向下转移。首先对儿子按照白变黑的时间升序排序。然后我们可以画出一个 行 列的矩阵,具体的,它长这样:
(图中相同颜色的值相等)
这个矩阵的实际意义是,第一个儿子的 dp 值是 与第一行的对位乘,第二个儿子的 dp 值是 与第二行的对位乘,... 。
根据题面性质,矩阵必然长这样。所有矩阵的总颜色数是 的。
我们先暴力求出第一个子树的 dp 值,然后每次从前一个子树的 dp 值推到后一个子树的 dp 值,这只需要对它们有区别的那个连续段进行区间乘。
最后,求一个点所有时刻的 dp 值的带权和显然是线段树能干的事。
代码长这样: http://192.168.188.88/submission/211470
由于我预处理写的太差了(要跑 1.9s),所以这份代码跑不过全局平衡二叉树。而且主席树卡空间,所以必须用区间删除代替区间乘 。
根据 djq 的说法,这个做法从底向上也可以 1log。但是我只会对这个矩形分治做到 2log。
ahoi t1 排列
感觉这题不够签到。
交换等价与合并两个环。由于本质不同的环长只有根号中,可以暴力枚举两个环的环长。算 lcm 的时候维护每个质数的最大的三个次幂即可。写起来挺复杂。
ahoi t2 钥匙
对每种颜色建出虚树分开处理。枚举钥匙开始 dfs,找出所有在括号序列上与它匹配的宝箱,以它为根在这些宝箱的子树中有 1 的贡献,查询时二维数点即可。
ahoi t3 山河重整
orz EI。
首先考虑 的 dp。 表示的数全都能被表示,和为 的方案。
考虑记 ,一次转移一整段满足 的 。
考虑容斥,对于 ,要减到所有满足存在一个 ,使得 的数和为 且 不选的方案。考虑从第一个这样的 转移, 的部分的方案是 , 的部分的方案是把 拆成 的数的和。
发现 ,考虑倍增转移,每次把左边一半放到一起跑整数拆分即可。复杂度是 。
*ahoi t4 回忆
问题等价与选最少的链覆盖所有限制链。
首先考虑这些选的链直上直下的部分(每个链有两端)。考虑 dfs,从下往上贪心,每个点维护一个集合,表示所有跨过这个点的链的链顶最深能到哪个祖先。
考虑加入所有以这个点为底的限制链,分两种情况讨论。如果当前集合非空,那么必然是延长当前链顶最浅的链的链顶。如果当前集合为空,那么若子树内已经有选的链(只是链顶太深不会覆盖到这个点),我们就要求子树内要延长一条链到这个点,否则我们只能增加一条链。
接下来考虑尽可能合并两条直上直下的链,两条链能合并当且仅当它们的链顶不是祖先后代关系。我们记 表示 子树内有多少链顶, 表示子树内最多匹配多少对链。转移长这样(其中 it 依次遍历 x 的子树:
int rx=c[x]-f[x]-f[x],ry=c[*it]-f[*it]-f[*it],nf=min(rx,ry);
if(rx>ry){
if(rx-ry<=f[*it]+f[*it]) nf=(c[x]+c[*it])/2;
else nf+=f[x]+f[*it]+f[*it];
}
else{
if(ry-rx<=f[x]+f[x]) nf=(c[x]+c[*it])/2;
else nf+=f[x]+f[x]+f[*it];
}
f[x]=nf;
c[x]+=c[*it];
不要忘记我们还要一下点需要子树内要延长一条链到这个点,由于我们在这个点时也往集合中加入了一条链,所以相当于需要在子树中删除一条链,不难证明这对 dp 值的影响是直接 c[x]--;f[x]=min(f[x],c[x]/2);
。
sdoi d1t1 整数序列
防签到题(bushi
根号分支。两个小数和两个大数都直接暴力即可,其中两个大数要记忆化不然复杂度不对。
考虑一个小数和一个大数。把只含这两个数的子序列的前缀和当成格路,则格路只会回头 次,所以我们可以用链表维护所有被经过超过一次的位置,对于大数每次可以跳一整段。
对于这个过程我们还需要找到每个小数的位置在大数的位置中的前驱后继,这可以离线然后对每个大数进行预处理。
复杂度,目前是 zloj 最优解。
sdoi d1t2 进制转换
个人感觉如果这题不让 ntt 过的话,难度不比下一题低。
考虑设所有 的倍数和 的倍数为关键点,那么一个数的权值只和它到左边的 的倍数的关键点的距离和它到右边的 的倍数的关键点的距离(以及这两个关键点是什么,但是因为暴力枚举了这个所以不重要)有关。
考虑设 表示到左边的 的倍数的关键点的距离为 的权值, 表示到右边的 的倍数的关键点的距离为 的权值。直接把这两个用 ntt 卷积起来就做完了,但是需要一些卡常。
发现 满足 or-积性,就是对于,。于是可以在 的基础上一位一位用数位 dp 转移。注意 的限制带来的影响。说起来容易,写起来有巨大多细节。
*sdoi d1t3 ⼦串统计
这题没有想象的那么难。
首先粘一段 xyx 的论文:
容易发现一个子串的出现次数和它的上下文相等。
然后你把 画到一个矩阵上,让上下文相同的串在一个块里,每个块的右上角对应一个上下文是自己的子串。这个矩阵大概长这样(我随便画的,不保证有这样的字符串):
即,每一块是一个阶梯,且有性质:每个右上角的点向下走不会撞到边的中间,向左走不会撞到边的中间(这是因为更短的串更容易被区分)。
我们要求的显然是从这个矩阵的主对角线向上或向右走到右上角的所有方案的权值和。
我们对于每个本质不同的上下文是自己的串计算它的上边界和右边界的每一个长度为一的边的答案。这里一个边的答案的定义是从主对角线走到这条边下面/左面,然后跨过它走到它的上面/右面的方案的权值和。
我们先证明这样的复杂度,然后考虑怎么算。
上边界上的每个点对应反串后缀树上的一个点,右边界上的每个点对应正串后缀树上的一个点,所以若本质不同的块只算一次(实际上确实只用算一次),上边界和右边界的长度和都是 的。
考虑计算一个块的答案,在此之前已经计算了左下角所有块的答案。考虑找出这个块左下角的轮廓线。分治,每次找到轮廓线的中点,划分成两个子问题,然后合并时就只需要解决矩形的情况了。左边界对右边界,左边界对上边界,下边界对右边界,下边界对上边界的贡献都是卷积的形式,ntt 即可。
最终的复杂度为 。
顺带一提,广为人知题也可以用这个方法做,复杂度可以做到 1log 但常数较大。
UPD: 原来这个东西就是对称压缩后缀自动机。 /jk/jk/jk
sdoi d2t1 小 N 的独立集
签到题,直接树 dp。
*sdoi d2t2 无处存储
好题。(bushi
首先这个题有个类似的题目 loj6115,是卡空间树分块求 lca。
我们只能开两个大小为 的 int 数组。但是我们还可以开一个 bitset 存每个点是否是关键点。
首先这个题有个很良心的地方是点权是 gen 出来的,所以我们可以先利用存点权的数组对树进行一些要用到一个数组的操作,然后再把点权 gen 出来。
考虑簇式树分块,借用存点权的数组存 size 即可完成。对每个关键点计算出深度。
然后我们把问题分为两部分,求 lca 和对到根的链进行链加/链和。
求 lca 时,首先把点暴力跳到簇主链上,然后像树剖那样做即可。但这样只能求出 lca 跳到簇主链上的结果。但此时我们已经求出了两个点的深度,可以重新做一遍暴力跳,看是否 lca 在簇主链上以外。
到根的链加链和就容易一些。暴力维护散边和主链上的散块,然后对主链上的整块打标记即可。
*sdoi d2t3 多边形
题目相当于任意删去边上的点做三角剖分,但是不能连接两个在同一条边上的点。
根据三角剖分的性质,若连接了两个同一条边上的点且它们之间有点,那么它们之间的点也会连到它们之间的点。所以这个限制等价于不能连接两个在同一条边上且距离为 的点。
容斥,钦定连接两个在同一条边上且距离为 的点相当于删掉了它们中间的点。
对于一个长度为 的段,在上面选 个点的容斥系数和为:
是 d-finite 的。
同时有
于是我们可以 的移动 。于是可以计算。
最后把每一段的 用分治 ntt 卷起来即可。
snoi t1 垃圾回收
终于有一道真正的签到题了。但是要注意判图不连通和开 unsigned long long!!1
snoi t2 军队
讲一下我 的垃圾做法。
首先块大小开 的幂,把 也增加到 的幂。然后对每个点开一颗动态开点的线段树,容易发现这样每个块都会完整的出现在线段树的一个点上。
然后前两个操作直接在线段树上维护。操作 2 在长度大于块大小的区间上不能 return,要暴力遍历每个长度为块大小的区间,然后加到这个区间的整体的和上。
查询时暴力在线段树上查散块,整块直接加即可。复杂度瓶颈在散点的查询。通过适当调整块大小可以把 放到根号下,但是反正过了就不管了。
*snoi t3 倍增
人类智慧题。
首先猜想答案的长度很小(实际上数据范围内答案最多为 )。于是我们枚举答案的长度 。
考虑最终的答案由若干个置换环任意排列而成。假设我们确定了每个环的每个位置是否进位和是否接收进位(可以计成两个二进制位)。则我们要判定三个东西来确定这个方案是否合法。每个环都要有合法的填数方式;每个环不能都是 或都是 ; 的总数和 的总数要相等。
前两个东西对于每个环是独立的。我们考虑枚举环上的第一位和每个位置是否接收进位,不难发现这样可以唯一确定一个环,且只有 种环。第二个限制可以之间判。枚举出所有合法的环后,对所有 找到一个合法的环(或者不存在),然后背包即可。
最后构造方案的话,由于 和 个数相等且只少有一个,可以让除了一对 和 之外的 和 成对相邻合并成 ,然后让剩下的一对 和 作为 和 的边界即可。
*snoi t4 数位
感觉这题非常厉害!!1。用这题的做法可以爆 uoj312. 【UNR #2】梦中的题面 的标算。
(冷知识,这题目前是今年省选洛谷上除了子串统计以外 ac 人数最少的,为啥大家都不做啊 /fn
(话说 是什么意思啊
首先考虑写出【每个数有多少种方案成为和】的生成函数,显然为
我们要求的就是【对于所有数码单调不增的数 ,计算 】。
考虑二项式定理展开分子,枚举选了 个 和 个 。令
那么我们就把问题转化为了计算 次 【对于所有数码单调不增的数 ,计算 】,其中 是常数。
但是我们发现这样有锅,因为【对于所有数码单调不增的数 ,计算 】这个问题不是收敛的。但是如果我们给出一个上界 ,那么【对于所有数码单调不增的数 ,计算 】这个东西是收敛的,且只要 是不小于 的定值, 的取值不会影响我们最终的结果(因为的最高次只有)。
因为这是一道数位 dp 题,所以我们希望 是 的幂次,这样数位 dp 的时候就只需要考虑位数的限制,不需要考虑数字大小的上限了。于是我们令 。
接下来考虑如何用数位 dp 求解这个问题。显然 。这里一定要有这个 ,不然的话当 特别小的时候这个式子的值可能反而不是 。于是我们在数位 dp 的时候要限制这个数不能小于 。考虑如何计算后面那个组合数,这显然是关于 的 次多项式(即可以写成 的线性组合)。可以暴力把 个一次多项式卷积起来预处理出线性组合的系数。
最终,我们设计出了这样的 dp。 表示高 位,第 位是 ,数字大小是否顶到下界,所有这样的数的 次方和。
转移时对 这一维用前缀和优化,只需枚举 ,做一次的复杂度位 。由于要做 次,总复杂度为。
lnoi t1 吃
笑死,vp 的时候不会做。
首先 必然选 ,然后你会发现剩下的部分只会选最多一个 ,否则只保留 最大的那个一定更优。枚举选哪个 即可。
lnoi t2 题
签到题。 表示前 个位置,当前 的个数分别是多少。注意 memset 很慢,在状态数的常数在 以下时都应该遍历每个状态而不是 memset。
*lnoi t3 盒
俗话说 “数形结合百般好,隔离分家万事休”。 这是一个同时用到了代数推导和组合意义的做法。
首先对 做前缀和, 的贡献显然是 。我们枚举每个位置 ,计算所有方案中 的和。这可以转化为计算 的方案数,所有 的方案的 的和( 的情况是对称的)。
记 表示长度为 的序列,,, 的方案数。记 表示长度为 的序列,,, 的所有方案的 的和。则
对 进行化简:
于是
接下来都是组合意义的推导了。
考虑 的组合意义是, 到 的网格,要求第一步必须向上走,走过的路径在走 时, 的方案数。
发现 中的这个 ,实际上是枚举删掉了前面若干列。那么我们给出这样一个构造:让 的一个路径前面加上 个上和 个右,那么正好从 走到了 ,于是
那么我们只需计算 就可以了。发现对于同一组要算的东西(同一组指的是,本身就是算 的为一组,从 转化到 的为一组), 随 单调不减。于是我们想要能从 推出 和 ,这样就可以通过做线性次 或 得到所有答案了。
增加是容易的,直接加上从 走到 再从 走到 的方案即可。
考虑 如何增加。首先,一个原先不合法的方案在 增加之后仍然不合法,我们只需减去原先合法但 增加之后不合法的方案即可。发现一条路径原先合法但 增加之后不合法,当且仅当它经过 (不论以什么方向经过)。直接减掉即可。
最后的代码写出来和 sdoid2t3 很像,因为两者都是类似莫队的那种递推。
lnoi t4 串
好怪啊。
首先相当于一个串 ,每次跳到 ,时刻可以跳到一个相同的串。那么不难发现从空串开始一定最优,那么我们要找到最长的可以从空串跳到的区间。
考虑倒着做,先考虑如何判断一个区间 是否能跳到空串。若 只出现了一次,那么只能跳到 。若 出现了超过一次,假设有另一个出现位置 。若 在 右边,那么我们可以跳到 ,之后每当当前区间被 包含时都跳到 中对应的区间,于是必然能跳到空串。若 在 左边,那么可以等到区间被 包含时都跳到 中对应的区间,然后重复,于是也必然能跳到空串。于是一个串 能跳到空串,当且仅当 或跳的路径中存在一个出现至少两场的串。
那么我们对两个条件分别计算出最长的合法区间并取 max。前者显然为 ,后者考虑枚举出现至少两场的串的 ,找到最左的 ,那么跳到 之后可以跳 步,跳到 之前可以跳 步,总共是 步。对于每个 计算 显然可以对反串建 SA 解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具