[省选联考 2021] 解题报告
这两天(2023-3-12/13)开了一场省选 VP,感触比较大,同时也有颇多要总结的地方,因此写下这篇博客。
省选
趁着周末来了一次 VP,感觉还是要考试性质的做题对自己的实力有一定帮助。
以上均为个人想法。
Day 1
卡牌游戏
不考虑正反面,求一个长度为
现在考虑加入限制,那么可以转换为牌有两种颜色,其中一种颜色最多被删去
思考方式仍然相同,我们将
我们维护一个双指针
假设我们先让
这题有一定的思维难度,主要是想到通过打标记的方式让所有的数变成一个序列再操作会简单很多。
代码不难,有一定细节。
矩阵游戏
2021年真的很喜欢游戏。
有一堆限制的矩阵并不好直接构造,赛时我本来的想法是四个相邻的数中取
采用调整法,不考虑限制,先构造出一个符合条件的矩阵,去掉限制后答案非常简单:
规定
满足条件的矩阵有一个很好的性质:如果一个矩阵
图函数
先是一些常规的转化:因为求的是
先给出一些性质:
的贡献是一对前缀- 如果是
,则 的路径上只存在 的点
那么问题转化成:对于
使用 Floyd 和 Dijkstra 均可求解。
Bonus:采用 BFS,倒着加边,对于一条新边
Day 2
宝石
DS 好题。
从题解中看到的一种比较清晰的做法。
我们先按照颜色在容器中的顺序对颜色进行重编号,问题就转化成:对于一条路径
我们将
那么思路就很明晰了,对于向上跳的这条链,我们先找出颜色为
对于这样的树上问题采用主席树,问题迎刃而解。
当然你也可以用任何你喜欢的方式。
滚榜
先考虑一个比较自然的 dp:
一种可行的想法是,我们只需要知道一个排列是否合法即可,而不关心真正的分配方式,因此我们可以贪心的分配通过的题目数。先给前面的队伍分配最少的能获得第一的的题目数量,剩下的分配给最后一支队伍即可。
此时假设给每个队分的题目数量为
同时还要注意,通过题数相同时,编号小的优先。
支配
不会支配树。/kk
支配的定义:
以下用 支配集 表示 支配某个点的所有点。
先从询问思考如下性质:
- 加入一条边,
有可能和 联通的路径变多了,因此支配集可能变小。但这条路径可能还是会经过支配集中的点,所以也有可能不变。
再考虑支配有哪些性质: - 如果
支配 , 支配 ,那么 支配 。
显然,如果 和 不联通, 和 不联通。 - 如果
支配 , 支配 ,那么 和 之间存在支配关系。
考虑反证,如果删去某一个点 ,因为不存在支配关系,所以必然有 的路径,同理有 的路径,那么 不支配 。与题设不符。
根据上述结论,我们可以发现支配的关系应该是一个树形结构,事实上确实如此。支配关系形成的树叫做支配树。支配树有如下性质:
- 设
的支配集为 ,则有且仅有一个点 且 被 中所有点支配,这个点是 。
根据树的形态推导。 的支配集为支配树上 的所有祖先。 的支配集中, 是支配集大小最大的那个点。
我们可以依此来构建支配树。- 加入一条边后,如果
的支配集发生改变,只有可能是 的支配集改变或 不再是 的支配点。 - 加入一条边
后, 不再是 的支配点,当且仅当删除 后, , 。
这道题可以
查询时,单次在树上暴力跳,复杂度单次
总时间复杂度有点卡,这里给出建树代码。
点击查看代码
inline void dfs1(int u, int del) {
vis[u][del] = true;
if (u == del) return;
for (int v : e[u]) if (!vis[v][del]) dfs1(v, del);
}
inline bool cmp(int x, int y) {
return domi[x].size() < domi[y].size();
}
inline void build() {
dfs1(1, 0);
for (int i = 1; i <= n; ++i) {
rnk[i] = i;
dfs1(1, i);
for (int j = 1; j <= n; ++j)
if (vis[j][0] && !vis[j][i])
domi[j].emplace_back(i);
}
sort(rnk + 1, rnk + n + 1, cmp);
for (int i = 1; i <= n; ++i) {
for (int v : domi[i]) {
if (domi[i].size() - 1 == domi[v].size()) {
fa[i] = v;
break;
}
}
}
}
其中,domi
是一个点的支配集,rnk
表示按照支配集大小排序后的各点编号。
本篇 blog 涉及所有代码。
后记
说是后记,其实是个人的一些想法。整场考试唯一用到的我比较不熟悉的算法就是 Day2T3 的支配树,但其实考场上略微手推也能得出一些关键结论。这场考试让我想起之前看到的一句话,
学的算法多
能力强
算法的本质是理解运用,因此在省选前学新算法可能不如好好复习自己的所学,而且 2022 赛季其实在我所学范围内的分有很多,在考场上,总是因为 做题做急了/没仔细思考/看到长题面不想看/学过的算法没有理解导致考场上忘记 这种主观原因出问题,感觉我的 OI生涯 可能需要积淀一段时间,先把学过的算法复习好再学习新知,这也是我开始记录自己所学的初衷。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探