假期计划 holiday
难度:蓝
一道很容易挂分的细节超多的图论题。
题意
-
有一张无向图,称若点 和点 满足 ,则 和 相连。
-
要求选定 4 个不同的,且不为 点1 的点,设为 , , , ,满足 点1 和 、 和 、 和 、 和 、 和 点1 相连,求最大点权和。
-
点数 ,边数 ,最大距离
题解
考虑先枚举两个点,再求出点权最大的满足条件的另两个点。
如果先求 和 ,则难以保证 和 相连。
而求 和 , 和 同理。
故先枚举 和 。
具体实现:
- 对于每个点预处理所有相连的点。
- 对于每个点预处理出和它与 点1 相连且权值最大的 4 个点。(理论上 3 个已经足够,但似乎有办法卡掉)
- 枚举 和 ,要 和 相连,分别从各自最大的 4 个点中枚举 和 ,注意保证各不相同。
代码
1 | /* |
策略游戏 game
难度:绿
一道以为是博弈论实际上是简单贪心的数据结构题。
题意
- 给定序列 A 和 B,序列中为整数,有两个人 小L 和 小Q。
- 多次询问,每次给定四个数 ,,和,小L 选择 有 ,小Q 选择 有 ,结果为 。
小L 想让 最大,小Q 想让 最小,他们都很聪明,会作出最佳选择。 - 序列长 ,询问数 。
题解
显然需要注意的就是符号了,所以要分类讨论。
为了叙述方便,认为 也是正数。
- 小L 选正数,小Q 选最小的;
- 若 小Q 最小的为正数,小L 选最大的;
- 否则,小L 选最小的。
- 小L 选负数,小Q 选最大的;
- 若 小Q 最大的为正数,小L 选最大的;
- 否则,小L 选最小的。
可以用 ST表 或者线段树维护区间中的最大,最小,非负数最小,负数最大即可。
实现细节参照代码。
代码
1 | /* |
额外注意
对于很大的静态数组初始化时,及时只初始化一部分,编译器也会将静态数组中的所有东西添加到可执行文件中,可能会导致编译错误或者 OJ 拒绝评测。
上例代码中已经标出。
星战 galaxy
难度:紫
考验人类智慧的随机化。
题意
-
给定一个有向图,每条边有一个状态。
-
有多个操作,每次执行以下操作之一:
- 1 禁用一条边(保证启用);
- 2 禁用以一个点为终点的所有边;
- 3 启用一条边(保证禁用);
- 4 启用以一个点为终点的所有边。
-
每次操作后,你需要考虑如果只考虑启用的边,是否同时满足以下两个条件:
- 1 对于每个点,是否存在一条以其为起点的长度无限的路径(每个点,每条边可经过无限多次)?
- 2 对于每个点,是否出度为 1 ?
-
点数 ,边数 ,操作数 。
题解
我们先考虑要满足的条件。
可以发现,假如满足了 条件2,必然满足 条件1,以下图为例:
证明:假设在满足了 条件2 的图中,存在一条极长路径,终点为 ,因为 存在一条出边,所以故不存在该路径。
可以发现,若维护出度,可以 处理每个询问,但是这样对于 操作2 和 操作4,需要 的时间。
而维护入度,每个操作都可以 时间内处理。
那么这样要怎么维护询问呢?
不能简单地判断和是否等于 ,因为可能出现这种情况:
所以问题就是,想办法让每个点“不同”,想到了随机化的方法:
对于每个点 ,赋予一个随机权值 ,
和一个要维护的量 ,即存在一条边连向它的点的权值和。
同时,记录最初 的状态,记为 。
对于每次操作:(设选中的点为 ,选中的边为 )
- 操作1:
- 操作2:
- 操作3:
- 操作4:
那么操作后如果 ,那么就可以认为每个点的出度都为 1 (每个点的权值都贡献了一次)。
代码
1 | /* |
感受和心得
最后,作为一名选手,谈一下感受和心得。
首先,本人认为,本次的题目质量不错,比初赛好多了,而难度和去年相当。
第一题,这种枚举几个算几个是常用的 trick 了,但细节很多,在考场上做了两个小时,还挂了分。感谢 CCF 的数据,只挂了10分,而民间数据中挂了 30 到 40 分。
第二题,第一眼以为是博弈论,虽然后面看出来了是简单贪心,但感觉处理正负号太麻烦,并且时间不够(实际上还挺多的,只是因为太急了),只打了 60 分。
第三题,打了暴力,没想到是乱搞随机化。
第四题,dp 好题,也只是打了暴力,实力不够。
得分最高 280 (100 + 100 + 50 + 30),实际 230。
总结一下经验就是,要心态平稳,把能拿的分都拿到(比如第二题),注意细节,不要挂分。
还是要吐槽以下考场环境,用 win7 就不说了,省里本来说要有的 noilinux 只有 cygwin,还是 32位 的,不过有 vim 也算能用。
NOIP2022 马上就到了(写这篇博客时 2022年11月13日,广州这几天病例每天新增几千例,在家上网课,不知道能不能办)
祝愿自己和广大 OIer 们在 NOIP2022 中 RP++,再创佳绩。