集训题目的简洁题解
集训题目的简要题解
写出来给自己看的,so大家不要太苛求。
每道题的思路大概是:题意——解法——当时的思路与事后总结
6.30强基选拔
T1:7154. 【2021强基选拔】蒟蒻的回文串(palindrome)
求一个字符串通过插入字符成为回文串的最少插入次数。
显然倒过来做一个LCS即可。
可以使用滚动数组优化空间复杂度。字符串的题要会转化。
T2:7155. 【2021强基选拔】蒟蒻的幻方(magic)
定义模\(m\)意义下的幻方为:\(n\times n\) 个数,每个数在 \([0,m)\) 中,且每行每列、两条对角线的和相等。给出 \(n,m\) ,求有多少个满足条件的模 \(m\) 意义下的幻方。
打表 数学推理可以发现答案是\(\begin{cases}
2m^{n^2-2n}(n=4\text{且}2|m)\\
m^{n^2-2n}(\text{otherwise})
\end{cases}\)
为什么?考虑列出同余方程,自由元只有 \(n^2-2n+1\) 个,加上对角线的限制就是 \(n^2-2n\) 个。
但是 \(n=4\) 的时候呢,有一条同余方程的系数 \(\gcd\) 起来 \(>1\) ,所以要乘\(2\).

表数据异常的时候要积极考虑 1.暴力打错 2.特殊情况.
计数题,没思路尽量打表。
T3:7156. 【2021强基选拔】蒟蒻的字符串(string)
\(n\)个数,按照字典序排序后的序列区间第 \(k\) 大问题。
直接排序然后主席树啊,有什么好说的。
考场上没注意到按照字典序排序,直接主席树上了,偏偏样例又都是1位数,就让我直接主席属于干上去,错认为过了。所以要仔细看题,多想,多怀疑。
能力范围300,实际得分180。这套题还是比较水的。好好想想打这么低的原因。在于没有好好读题,看到了特殊情况,不深入思考。
7.2模拟
T1:3363. 【NOI2013模拟】Number
四种不同的读电话号码的方式:
-
xxx-xxx-xxxxx 例如 151-958-83019
-
xxx-xxxx-xxxx 例如 151-9588-3019
-
xxxx-xxxx-xxx 例如 1519-5883-019
-
xxxx-xxx-xxxx 例如 1519-588-3019
一些字符串不能在任何一种读法中出现。求合法的电话号码数量。
简单的数位dp。
没什么好说的,签到题。
T2:3364. Snake
一些蛇覆盖了一个网格。每个格子要么是一个障碍物,要么是蛇的一部分。每条蛇占据了一条折线 (拐角处只能水平和竖直连接),且至少占据两个格子。蛇与蛇之间不重叠,蛇也不会与自己重叠。每条蛇还必须满足以下两个条件中的一个:
- 两个端点所在的格子在网格的边界。这样的蛇至少长度为 2。
- 蛇构成一个环,即两个端点相邻 (垂直或水平)。注意这个条件意味着一条构成环的蛇至少需要占据 4 个格。
如果把第二类蛇的首尾连起来,发现形成一个环。此时对于非边界点,一个点的度数必定等于 2 ,边界的点度数 1 或 2 。
这启发我们使用上下界网络流来解决这个问题。黑白染色,由 \(S\) 向所有白点连一条边,上界为2,假如是边界点,那么下界为 1 ,否则为 2 。相邻的白点向黑点连一条上界为1,下界为0的边表示是否连通。对于黑点也用同样的方式和 \(T\) 连边。
这里记一下如何做上下界网络流:
无源汇情况:新建源汇,考虑一个点的 \(M=in[x]-out[x]\),若 \(M<0\) ,说明流出过多, \(x\) 向 \(T\) 连一条流量为 \(-M\) 的边,若 \(M>0\) ,说明流入过多, \(S\) 向 \(x\) 连一条流量为 \(M\) 的边。 \(M=0\) 不用管。
在建图完毕之后跑 \(S\) 到 \(T\) 的最大流,若 \(S\) 连出去的边全部满流,则存在可行流,否则不存在。
有源汇可行流,我们可以加入一条 \(T\) 到 \(S\) 的上界为 \(\inf\) ,下界为 \(0\) 的边转化为无源汇上下界可行流问题。
若有解,则 \(S\) 到 \(T\) 的可行流流量等于 \(T\) 到 \(S\) 的附加边的流量。
有源汇最大流,注意清零gap,d数组。以及在残量网络上面再跑一次最大流。
某sls:看到限制不是人做的东西的时候就想到网络流。
T3:3365. 【NOI2013模拟】Postman
提交答案题。给出一个无向图,找到一条走遍每一条边的方法,使总花费最小。
形成欧拉回路的充要条件即每个点为偶数度数,于是只需把奇数度数的点两两匹配,即把两个奇数点之间的最短路径再多走一遍,这样途中遇到的点不改变奇偶,只有两端改变奇偶。
详见《《欧拉回路性质与应用探究》仇荣琦》
这样就是要解决一个完全图的带权最大匹配,可以用带花树解决
http://fanhq666.blog.163.com/blog/static/8194342620120304463580/
当然,上面那个地址只是不带权板的。。。
可用模拟退火来实现匹配,每次尝试交换两个点所匹配的点,这样就能拿82+了
不像是能做的题。
T4:3360. 【NOI2013模拟】苹果树
树上数路径颜色,但是这个数颜色的人色盲,会把一种颜色,看成另一种。
树上莫队照样做,方法是通过欧拉序拉到序列上,再单独考虑lca。
板子题,不解释。
提答题要敢玩,暴力分要拿。
7.3模拟
T1:3362. 【NOI2013模拟】数数
如果一个数的每一位数字能分成两个可重集,使两个集合数字和相等,称这个数是优美的。求\([L,R]\)区间有多少优美的。
直接数位dp。。。会算重,考虑 \(L,R\le10^9\) 于是考虑分段打表。
考场沉迷调题没把表打完。
T2:3373. Line
有个hentai校长要看学生列队。 \(N\) 行 \(M\) 列的队伍,一行不能有连续 \(P\) 个男的,一列全是男的不好看,这种列的个数不能超过 \(Q\) 个。
流汗黄豆。。注意到 \(M\le10^8\) ,应该是矩乘,但是我不会。咕咕咕。
T3:3374. 【NOI2013模拟】Book
买 \(n\) 本书,第一本书的价格必须恰为 \(X\) ,而之后买的每一本书,若是比上一本更昂贵,则价格多 \(A\) 元;若是比上一本更便宜,则价格少 \(B\) 元。给出总书价,求一个合法的书的价格序列。
考虑在第 \(i\) 个位置 \(+A\) ,对答案的贡献是 \((n-i) \cdot A\) ,另一种情况同理,所以问题变成了一个经典问题:从 \(1\) 到 \(N − 1\) 中选择一些数,使得和为 \(P\)。贪心从大到小选就好了。虽然并不会证明。
签到题。
T4:3361. 【NOI2013模拟】Manufactoria
LH玩了半个小时的机械工厂。两种东西,一种传送带,一种红蓝选择器,大意就是匹配该位的颜色并且给到对应位置。
三个图,求最少保存多少个能够识别出最初三个能识别出的机器人。
可以缩图,无关的点变为一个点,红蓝选择器看做自动机上的一个节点,问题变成了判断两个自动机是否等价。
设 \(f(i,j,k)\) 表示匹配到三个自动机的 \(i,j,k\) 节点,是否等价。bfs 转移即可。
能力范围200,实际得分165,注意不要死磕一道自己都不确定正确性的题!有好的替代方案要敢于尝试(分段打表)。
7.05模拟
T1:3242. Spacing
宽 \(W\) 的稿纸,\(N\) 个单词,单词之间的空格可以有多个,要求一个单词不能被分割成两行,一个单词不能中间有空格,每一行的开头结尾必须有字母(除了结尾行最后可以没有字母),求最长连续空格长度的最小值。
考虑二分这个答案,转化成判定性问题。设 \(f_i\) 表示前 \(i\) 个单词能否满足排版需求,容易发现 \(i\) 转移到的位置是一个区间。二分找出这个区间然后线段树修改一下就是两只 \(\log\) 的了。但是还能优化。考虑从前转移过来而不是更新后面的值。于是前面也是一个区间,这个前缀和一下就能少一只 \(\log\)。
签到题。
T2:3293. 【SHTSC2013】阶乘字符串
给定一个由前 \(n\) 个小写字母组成的串 \(S\) 。串 \(S\) 是阶乘字符串当且仅当前 \(n\) 个小写字母的全排列都作为 \(S\) 的子序列出现。现在判断 \(S\) 是不是阶乘字符串。\(n\le26\)。
某聚聚提出大家都不会证明的猜想:\(n>21\) 时无解。好嘛,就这么做。设 \(f_S\) 表示字符集为 \(S\) 的字符串的全排列都出现过的结尾处的位置。预处理一个 \(nxt_{i,j}\) 表示 \(i\) 位置后面第一个 \(j\) 字符,转移时枚举一个字符 \(k\) 从 \(S\) 中拿去,取每个字符作为结尾时的位置的最大值:
若 \(f_{U}\le|S|\) ,那么就是阶乘字符串。
我第一次看到这个转移式子简直惊为天人,太牛逼了谁想出来的。然后大家都说转移显然。。
T3:6108. 十二省联考2019 骗分过样例
没有题面谢谢。
我向来是不惮以最坏的恶意揣测出题人的,,,然而,
比赛的时候玩了23pts,\(\mu\) 筛错了丢了4pts。
*能力范围168,实际得分163,一定要把该拿到的分拿到。
7.6模拟
T1:3392. 【NOIP2013模拟】四叶草魔杖
7.19模拟
T1:7197. 「JOI 2020 Final」只不过是长的领带
给出 \(n\) 和两个序列 \(a_{1...n}, b_{1...n+1}\) , 对于第 \(i\) 次询问,从 \(b\) 中删除 \(b_i\) ,并将其他的 \(a,b\) 一一对应,此种对应方案的答案为 \(a_{p_k}-b_{p_k}\) 的最大值,对于每次询问,求最小的答案。
显然分别排序,按顺序对应,然后前缀后缀处理一下就好了。
没什么好说的,签到题。
T2:3661. [SHOI2014]概率充电器
一棵 \(n\) 个点的树,每个点有 \(p_i\) 的概率被充电,若一条边的权值为 \(q_i\) ,那么若这条边的一个端点被充电,另一端就有 \(q_i\) 的概率也能充电。求充电点数的期望。
树形dp。其实答案就是每个点被充电的概率和。一个点可能被充电有三种情况:自己、子树、子树外。经典树形dp。
考试因为没有加双向边,调了很久。另外使用 vector 的时候貌似出现了 undefined behavior。先挖个坑。
T3:
\(n\) 个点排成一个圈,每个点有一个权值 \(a_i\),选出其中的一些使得权值和最大,且没有连续四个同时选取。\(q\) 次修改,同时询问。
其实可以线段树上维护 \(f_{i,j}\) 表示前缀选了 \(i\) 个,后缀选了 \(j\) 个的最大值。 \(\Theta(4^4)\) 合并即可。这样常数比较大,可以考虑动态dp少一个 \(n\)。
想到了没敢打系列,主要去调T2了。
能力范围300,实际得分170。强烈谴责OJ卡栈空间的行为。以及T2调了太久,要尽量多写题,提高码力。
浙公网安备 33010602011771号