\(P6148\)

根据题目发现一下性质:

性质 \(1\):对原序列做 \(a\) 次操作得到的新序列,在这个新序列再做 \(b\) 次操作,最后得到的序列想到于在原序列做 \(a + b\) 次操作。(证明过于复杂,我就不写了)

性质 \(2\)\(M \times N \le 10^8\),直接做一次操作不会超时。

因为反转操作具有结合律,考虑设计状态:

\(dp_{i, j}\) 表示进行 \(2^i\) 次操作后第 \(j\) 头奶牛所在的位置。

暴力模拟计算出 \(dp_{0, i}\) 的值,然后处理出 \(dp_{i, j}\) 的值。

然后就可以处理第 \(i\) 头奶牛第 \(k\) 次所在的位置。

时空复杂度:

时间复杂度:\(O(N \times M + N \times \log_{2} K)\)

空间复杂度:\(O(N \times \log_{2} K)\)

P6149

换句话形容题意:

首先,枚举一个三角形中的一个点 \(i\),那么与 \(x\) 轴平行就是 \(X_i = X_j\),与 \(y\) 轴平行就是 \(Y_i = Y_j\)。(j 是另外一个点)。

所以题目其实让你输出:

\(\sum \limits_{i=1} ^{i=N} (\sum \limits_{j=1}^{j=N}(X_i = X_j) | Y_i - Y_j | \times \sum \limits_{k=1}^{k=N} (Y_i = Y_k) | X_i - X_k |\))

化简得:

\(\sum \limits_{i = 1}^{i = N} (\sum \limits_{j = 1}^{j = N}(X_i = X_j) | Y_i - Y_j |) \times (\sum \limits_{k = 1} ^ {k = N}(Y_i = Y_k) | X_i - X_k |)\)

那么暴力实现就是 \(O(N ^ 2)\) 的时间复杂度,可以开桶记录 \(X_i = X_j\) 时的 \(Y_j\)\(Y_i = Y_j\) 时的 \(X_j\),那么对于绝对值有两种情况。

\(|a - b| = \left\{ \begin{aligned} & a - b & a \ge b & \cr & b - a & a < b & \cr \end{aligned} \right.\)

我们可以通过二分找到第一个大于等于 \(X_i\)\(Y_i\),然后分别处理绝对值的两种情况即可。

时间复杂度:\(O(N \log_{2} N)\)

空间复杂度:\(O(N)\)

\(P6150\)

其实我还是不懂。

posted on 2024-02-23 22:31  appear  阅读(9)  评论(0)    收藏  举报