欢迎光临散文网 会员登陆 & 注册

NCTU PCCA Winter Contest 2021 个人题解

2021-03-10 17:48 作者:俊杰_Charles  | 我要投稿

比赛链接:https://codeforces.com/gym/102946

官方题解:https://hackmd.io/@HNO2/HJTOKCOe_

难度:3星

赛中过题情况(2人组队)

A. A Water Problem

题意:给定一个数 x,求 x 的各位数字之和与 x 本身的乘积。

题解:按题意计算即可。

B. Bongcloud

题意:给定一个 01 矩阵,求上下对称的子矩阵有多少个。

题解:对于每列使用一次马拉车算法,求得以每个位置为中心,上下拓展的最长回文串长度。对于某一行,我们将以各位置为中心的最长回文串描出对应方格,得到如下的图。

这里是回文串长度为奇数的情况,若回文串长度为偶数,则对称轴在两行之间

如上图,以蓝色行为对称轴,且范围在黑色方格内的子矩形一定满足条件。对于每条对称轴,求出这样的子矩形有多少个即可。根据对称性,我们可只关注对称轴的一侧。

问题便可转化为,求以每个蓝色方格作为右下角的矩形有多少个。以最右侧蓝色方块为例,满足条件的矩形范围落在下图的黄色区域中,以该蓝色方块作为右下角的矩形个数实际上就是区域中的方格数。

区域包括蓝色方块本身

而这样的区域一定是一个单调上升的区域,因此我们在从左向右枚举这些位置时,用一个单调栈维护这样的区域即可。时间复杂度 O(nm)

C. Chicken Nuggets

题意:给定一个树,各点有一个点权。如果一个点被去掉,则与之相连的边也会被去掉。现需要去掉一些点,使得剩下的各点与之相连的边数都为奇数,求剩下各点的点权和最大是多少。

题解:定义状态 %5Ctext%7Bdp%7D%5Bu%5D%5B0%2F1%5D%5B0%2F1%5D,表示以 u 为根的子树,点 u 去掉/保留,点 u 的度数为偶数/奇数,该状态下点权和的最大值。最初,%5Ctext%7Bdp%7D%5Bu%5D%5B0%5D%5B0%5D%3D0%5Ctext%7Bdp%7D%5Bu%5D%5B1%5D%5B0%5D%3Dc%5Bu%5D%5Ctext%7Bdp%7D%5Bu%5D%5B1%5D%5B1%5D%3D-%5Cinfty%5Ctext%7Bdp%7D%5Bu%5D%5B0%5D%5B1%5D 是不可能出现的状态)。然后像背包 dp 一样,将 u 的各个儿子放入背包中。假设将 u 的儿子 v 放入背包前,u 的各个 dp 值为 %5Ctext%7Bpre%7D%5Bu%5D%5B0%2F1%5D%5B0%2F1%5D。此时将 v 放入背包中,有:

  • %5Ctext%7Bdp%7D%5Bu%5D%5B0%5D%5B0%5D%20%3D%20%5Ctext%7Bpre%7D%5Bu%5D%5B0%5D%5B0%5D%20%2B%20%5Cmax(%5Ctext%7Bdp%7D%5Bv%5D%5B0%5D%5B0%5D%2C%20%5Ctext%7Bdp%7D%5Bv%5D%5B1%5D%5B1%5D)

  • %5Ctext%7Bdp%7D%5Bu%5D%5B1%5D%5B0%5D%20%3D%20%5Cmax(%5Ctext%7Bpre%7D%5Bu%5D%5B1%5D%5B0%5D%20%2B%20%5Ctext%7Bdp%7D%5Bv%5D%5B0%5D%5B0%5D%2C%20%5Ctext%7Bpre%7D%5Bu%5D%5B1%5D%5B1%5D%20%2B%20%5Ctext%7Bdp%7D%5Bv%5D%5B1%5D%5B0%5D)

  • %5Ctext%7Bdp%7D%5Bu%5D%5B1%5D%5B1%5D%20%3D%20%5Cmax(%5Ctext%7Bpre%7D%5Bu%5D%5B1%5D%5B0%5D%20%2B%20%5Ctext%7Bdp%7D%5Bv%5D%5B1%5D%5B0%5D%2C%20%5Ctext%7Bpre%7D%5Bu%5D%5B1%5D%5B1%5D%20%2B%20%5Ctext%7Bdp%7D%5Bv%5D%5B0%5D%5B0%5D)

最终答案为 %5Cmax(%5Ctext%7Bdp%7D%5B1%5D%5B0%5D%5B0%5D%2C%20%5Ctext%7Bdp%7D%5B1%5D%5B1%5D%5B1%5D),时间复杂度 O(n)

D. Discombobulator 3000

题意:交互题。现有两个数列 a_0%2Ca_1%2C%5Cdots%2Ca_%7Bn-1%7Db_0%2Cb_1%2C%5Cdots%2Cb_%7Bn-1%7D,两者都为 1 到 n 的排列,且 b 为 a 循环右移 k 位的结果。每次询问两个值 x%2Cy,可以得到 %5Cmax(a_x%2Cb_y)。在询问次数不超过 2n 的条件下,求得 k

题解:询问 %5Cmax(a_0%2Cb_0)%2C%5Cmax(a_1%2Cb_1)%2C%5Cdots%2C%5Cmax(a_%7Bn-1%7D%2Cb_%7Bn-1%7D),得到的结果中若只有一个 n,则 k%3D0。若有两个 n,即 %5Cmax(a_i%2Cb_i)%3D%5Cmax(a_j%2Cb_j)%3Dn,则再询问 %5Cmax(a_i%2Cb_j)。若 %5Cmax(a_i%2Cb_j)%3Dn,说明 a_i%3Db_j%3Dn,否则说明 a_j%3Db_i%3Dn,据此得出 k。询问次数最多为 n%2B1

E. Evenly Distributed

题意:定义一个数集可以被均分,表示存在一种方案将这个数集分为两个集合,使得这两个集合中数的和相等。现要求够造一个含 n 个正整数的集合,这 n 个数的和为 k,且这个集合的任意一个子集都不能被均分。

题解:贪心,每次把能放入集合中最小的数放入集合,那么依次放入集合的数为 1%2C2%2C4%2C8%2C%5Cdots,可以发现正好都是 2 的幂次。按照贪心的思路,先在集合中放入 1%2C2%2C4%2C%5Cdots%2C2%5E%7Bn-2%7D,那么最后需要放入的则是 k-(1%2B2%2B4%2B%5Cdots%2B2%5E%7Bn-2%7D)%3Dk-(2%5E%7Bn-1%7D-1)。而最后放入的数应当大于 2%5E%7Bn-1%7D,也就是说如果 k-(2%5E%7Bn-1%7D-1)%3C2%5E%7Bn-1%7D,即k%3C2%5En-1,那么满足条件的构造方式便是不存在的。

F. Fishy Study

题意:有一个鱼塘,以 n 行 n 列的 01 矩阵表示,0 表示该位置一开始没有鱼,1 表示该位置一开始有鱼。同时,鱼塘中某个位置还有一个海胆。每一天,鱼塘中依次发生如下变化:

  1. 海胆会往上、下、左、右中可移动的方向移动一格。

  2. 对于每个位置,如果海胆在该位置,则该位置这一天没有鱼;否则,如果该位置前一天有鱼,且周围八个格子中有 2 或 3 条鱼,则该位置这一天有鱼;否则,如果该位置前一天周围八个格子中有 3 条鱼,则该位置这一天有鱼;否则,该位置这一天没有鱼。

给出鱼塘的初始状态,并给出一个理想状态,问 d 天内该鱼塘是否可能出现理想状态。

题解:鱼塘的最终状态其实只与海胆的移动路线有关。由于 d 最大为 8,海胆的移动路线最多有 4%5E8%3D65536 种,爆搜即可。我的代码中使用了 bitset 存储状态,需要注意下标的区别。

G. Group-Theoretic Machine

题意:给出三维空间里的六个点 O%2CR%2CW%2CY%2CG%2CB,其中 OR 平行于 x 轴,WY 平行于 y 轴,GB 平行于 z 轴。问是否存在一个正方体,使得这六个点分别在正方体的六个面上。若存在,求出这个正方体的各顶点坐标。

题解:不会。

H. Halting Problem

题意:给一张连通图,要求选出一个点集,使得点集中任意选择两点,从一点到另一点的任意路径长度都为 k 的倍数。求点集中点数最多为多少。

题解:显然,k%3D1 时答案为所有的点。由于是任意路径,因此两点间如果存在一条长度为 l 的路径,那么通过重复走某条边可以得到长度为 l%2B2 的路径。因此,当 k%3E2 时,答案只能为 1。当 k%3D2 时,如果给出的图为二分图,二分图左部和右部对应的两个点集都是满足条件的,选择点数更多的即可;如果不是二分图,可以证明两个不同点之间肯定既存在长度为偶数的路径,又存在长度为奇数的路径,所以此时答案只能为 1。判断是否为二分图使用染色法,时间复杂度 O(n)

写这篇题解主要是测试b站专栏的代码高亮以及公式功能,以后或许会发更多的题解。

NCTU PCCA Winter Contest 2021 个人题解的评论 (共 条)

分享到微博请遵守国家法律