\(P9187\)
首先处理字符串过于复杂,时间复杂度还会较高,而字符串只会有 \(G\) 和 \(H\),\(2^c \le 3 \times 10^5\),所以先将字符串转成二进制会更优,令第 \(i\) 个字符串转成的二进制为 \(A_i\)。
\(25\) 分
观察到 \(2^c \le N\),所以 \(A_1 \sim A_N\),为了加快效率我们只对这 \(2^c\) 种不同的二进制计算答案。
对于两个二进制 \(X\) 和 \(Y\),显然他们的差异值为 \(X \oplus Y\) 中二进制下一的数量,所以我们可以预处理出每个二进制数一的个数。
时空复杂度:
时间复杂度:\(O(2^{2c})\)。
空间复杂度:\(O(2^c)\)。
\(45\) 分
依次枚举 \(i\)。
考虑设计状态:
初始状态:\((A_i, 0)\)。
状态:\((S, cnt)\) 表示 \(A_i\) 与 \(S\) 的差异值为 \(cnt\)。
转移:\((S, cnt) \rightarrow (S \oplus 2^i, cnt + 1)\)。
由于边权只有 \(1\),使用广度优先搜索。
但还不够,时间复杂度已经超标了。
考虑重新设计初始状态和转移:
初始状态:\((A_i 取反, C)\)
转移:\((S, cnt) \rightarrow (S \oplus 2^i, cnt - 1)\)。
时间复杂度:\(O(N \times (C(c, 0) + C(c, 1) + C(c, 2) + C(c, 3)))\)
空间复杂度:\(O(N \times (C(c, 0) + C(c, 1) + C(c, 2) + C(c, 3)))\)
100分
令 \(dist(i, j)\) 表示二进制 \(i\) 与 \(j\) 的差异值。
\(dist(i, j) = c - dist(i, j 取反)\),取反后相等的数变成不等的了,不等的数变成相等的了,所以 \(dist(i, j 取反)\) 所得的结果是 \(i\) 与 \(j\) 在二进制下有多少位相等,用整体的位数减去相等的位数就是不等的位数了。
因为差异值是 \(c - dist(i, j 取反)\),那么为了想求出 \(i\) 与某个数的最大差异值,所以我们可以将问题转化为求 \(j\) 取反走到 \(i\) 的最小值,这样就可以多元广度优先搜索求解,那为什么之前的状态不行呢?因为之前求的是最大值,第一次遍历到的状态不一定是最优的。
P3066
70分
由于 \(1 \le p_i < i\),所以不需要使用递归,常数较小。
直接暴力求解。
时空复杂度:
时间复杂度:\(O(n^2)\)。
空间复杂度:\(O(n)\)
100分
发现一条性质:若 \(i\) 到自己的 \(x\) 级祖先之间的距离 \(\le t\),那么 \(i\) 到自己的 \(x - 1\) 级祖先之间的距离也 \(\le t\)。\((x > 1)\)。
这里就可以使用倍增或二分。
找到自己最大的 \(x\) 级祖先和自己的距离 \(\le t\),可以使用点差分进行优化。
因为这里需要先求出 \(x\) 级祖先所以这里使用倍增时间复杂度更优。
时空复杂度:
时间复杂度:\(O(N \log_{2} N)\)。
空间复杂度:\(O(N \log_{2} N)\)
P8191
1~3号点
容易看出此题是 MST,然后暴力建边。
时空复杂度:
时间复杂度:\(O(N^2 \log_{2} N^2)\)
空间复杂度:\(O(N^2)\)
100分
看到 \(0 \le y \le 10\),我们对于每一个值的 \(y\) 找到最接近的 \(x\) 并与它建边。
时空复杂度:
时间复杂度:\(O(20 \times N \log_{2} {20 \times N})\)
空间复杂度:\(O(20 \times N)\)
浙公网安备 33010602011771号