\(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)\)

posted on 2024-02-23 23:25  appear  阅读(14)  评论(0)    收藏  举报