C - 智巧灵蕈大竞逐
基本信息
题目出处 | 2022 ICPC 亚洲区域赛南京站 |
队伍通过率 | 1/465 (0.2%) |
题解
贪心策略
直接做比较难以处理盖章操作,考虑时光倒流,从目标状态开始一步步撤销操作得到能匹配初始状态的矩阵。交换操作与旋转操作均可逆,对于盖章操作,逆操作相当于将一个能与要盖的章匹配上的子矩阵全变为通配符。
由于存在交换操作,字符的位置几乎是无关紧要的,只需要对每种字符判断个数就能知道一个章是否可能盖下去。将一个字符变为通配符后,会将原来不能盖的章变得能盖(而不会倒过来使原来能盖的章变得不能盖),因此通配符越多越好。也就是说,我们可以遵循“能盖的章现在就盖”的贪心策略。如果保证每次盖章操作至少新增一个通配符,盖章次数就不会超过 \(nm\) 次,符合 \(400\) 次盖章操作的限制。
不妨选定盖章的位置就是矩阵左上角。一开始选定一个能盖的章后,通过交换操作使得左上角矩阵与章匹配上,使用盖章操作将这些位置全变成通配符。接下来每次移动一个章里有的字符到左上角矩阵对应位置,再进行盖章操作就能新增一个通配符。一直盖同一个章,直到无法再新增更多通配符,这个章之后也都用不上了。接下来找到下一个能盖的章,重复以上操作。
当所有的章都已经用不上时,检查当前矩阵每种字符的数量判断是否可能经过若干次交换操作后与初始矩阵进行匹配。其实就是把初始矩阵也视为一个章,然后检查这个章是否能盖上。如果可能匹配则有解,并构造交换方案,否则无解。
操作步数分析
以上操作方案中,分为“盖一个新章”和“用旧章转化一个字符”两种操作。以下分析每种操作需要消耗的交换步数。
如果把初始矩阵也视为一个章,则“盖一个新章”操作将进行 \((k + 1)\) 次,每次可能会移动矩阵中所有的字符(也就是 \(nm\) 个字符),而每个字符移动到目标位置最多会花 \((n + m - 1)\) 步。因此,“盖一个新章”最多消耗 \(nm(n + m - 1)(k + 1)\) 步交换。
而“用旧章转化一个字符”最多进行 \(nm\) 次,每次只移动给一个字符到目标位置,最多花费 \((n + m - 1)\) 步。因此,“用旧章转化一个字符”最多消耗 \(nm(n + m - 1)\) 步交换。
因此,所有操作最多总共消耗 \(nm(n + m - 1)(k + 2)\) 步交换,加上 \(400\) 次盖章操作也符合 \(4 \times 10^5\) 次操作的限制。这个限制实际上是比较宽松的,旋转操作也用不上。
复杂度分析
接下来分析程序的复杂度。我们在模拟过程中,需要用一个数组动态维护当前矩阵中每种字符的个数,以及通配符的数量。
由于每次操作都至少将一个字符变为通配符,我们需要检查 \(nm\) 次当前章是否还能盖。这一部分的复杂度是 \(\mathcal{O}(nm|\Sigma|)\),其中 \(|\Sigma|\) 是字符集的大小。
如果当前章不能盖了,我们要换一个新章来盖。换章将会进行 \((k + 1)\) 次。我们直接枚举接下来盖哪个章,这一部分的复杂度是 \(\mathcal{O}(k^2|\Sigma|)\)。
接下来,``盖一个新章'' 操作将进行 \((k + 1)\) 次,每次我们暴力寻找目标字符的初始位置,并将它移动到目标位置。这一部分的复杂度是 \(\mathcal{O}(n^2m^2(n + m))\)。
最后,``用旧章转化一个字符'' 操作将进行 \(nm\) 次,每次仍然暴力寻找目标字符的初始位置,并将它移动到目标位置。这一部分的复杂度是 \(\mathcal{O}(n^2m^2(n + m))\)。
因此总体复杂度为 \(\mathcal{O}(n^2m^2(n + m) + (nm + k^2)|\Sigma|)\),大概不到 \(10^7\),能很快运行完成。
参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
|