CSP-S 2022 题解

感觉不如校内模拟赛。

但是保持状态和不挂分是很难的。

希望 NOIP 可以做到不挂分,至少拿满暴力。

T1 假期计划

签到。

发现 n2.5×103,于是考虑一些 O(n2) 做法。

考虑枚举中间的两个顶点 B,C。假设有一对合法的 B,C,考虑把可能合法的 A 和可能合法的 D 用 bfs O(n2) 预处理出来。

注意到 A,D 中至少有一个顶点取到可能的最优值,于是分讨 A,D 取最优值的情况,然后取较优解即可。

这样做的好处在于分讨没有讨论前三大的做法复杂,但是复杂度多一只 log

复杂度 O(n2logn)

T2 策略游戏

真·签到。

考虑分讨:

  1. 先手取正数。

    1. 后手有负数
      此时后手取最小负数,先手取最小正数
    2. 后手有 0
      此时后手取 0
    3. 后手只有正数
      此时后手取最小正数,先手取最大正数
  2. 先手取负数

    1. 后手有正数
      此时先手取最大负数,后手取最大正数
    2. 后手有 0
      此时后手取 0
    3. 后手只有负数
      此时先手取最小负数,后手取最大负数
  3. 先手取 0
    贡献为 0

由于先手足够聪明,因此会在三种情况中取最优值。用 RMQ 维护区间最值即可。

T3 星战

玄妙哈希乱搞。

考场暴力变量没初始化,一分没有,可惜了。

一开始想的是数据结构一类的东西维护,没想到正解是哈希。

多老师:考场看了半个小时还不会,觉得没有确定性算法,于是想到哈希。

条件 2 的含义是 n 个点 n 条有向边,且每个点的出度为 1,显然是此时图是一个内向基环树森林,于是必然满足条件 1。

S 为当前图中所有存在的边的起点构成的可重集,考虑动态维护 S 的哈希值,和构成内向基环树的可重集比较即可 O(1) 判断合法性。

对于操作 1,3,直接修改哈希值即可。

对于操作 2,4,可以考虑先维护出每个点初始时对哈希值的贡献,然后再动态维护每个点当前对哈希值的贡献。这样 2 操作可以直接消去剩余的贡献,4 操作直接加回删去的贡献。

哈希可以用一次方和还有异或和直接草,正确性不会证。担心过不了就再加一个二次方和。

由乃与大母神原型和偶像崇拜

时间复杂度 O(n+m)

T4 数据传输

倍增 + 矩乘优化 dp。

76 pts 一眼提取树链 dp,考虑优化。

你发现这是静态的,于是考虑倍增。(动态就树剖)

然而不好维护答案,考虑把提取树链做法改成直接在树上做。

此时我们需要向下枚举若干结点,可以矩乘优化。

假设提取树链序列,令 fi 为前 i 个顶点的答案。

那么当前矩阵为:

[fi1fi2fi3]

目标矩阵为:

[fifi1fi2]

由于转移是取 min,所以这里放的不是系数而是要加上的常数。由此得到转移矩阵:

[ai0ai0ai]

初始矩阵为:

[000]

然而这样做会在 k=3 的时候寄掉,原因是可以走到树上路径以外的点。

观察一下,我们发现至多只会走到距离树上路径为 1 的点。考虑它对于状态转移的影响,实际上只是使 fi1 多一种转移。

具体地,fi1 的转移可以通过走上面提到的点得到。于是考虑在每个点的矩阵上面多加一种 fi2fi1 的转移,代表走这种点的贡献。

体现在代码上就是先取这些点的点权最小值,再令 w[1][1] 和它取 min

复杂度 O(33nlogn)

posted @   kymru  阅读(380)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示
主题色彩