\(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\)
其实我还是不懂。
浙公网安备 33010602011771号