杂题选练
一些杂题但可以记录下的。
首先我们拆位,然后枚举每一个点 \((i,j)\),考虑将该点作为矩阵的 右下角 的贡献,先考虑 \(AND\),只有矩阵中的值都为 \(1\) 时才造成贡献,所以我们考虑记录 \((i,j)\) 左上方最大全为 \(1\) 的从左到右 单调非严格递减 的图形,形如楼梯,我们可以先记录 \(l_{i,j}\) 表示其左边 最长连续 长度(包含其本身),则为了满足 单调性,我们需要找到矩阵面积最大值,可以用单调栈维护,最后答案即为 \(s_{k,i,j} \times 2^k\) 的和,\(k\) 是拆的位。
\(OR\) 类似,可以发现只有矩阵中的值都为 \(0\) 时才不造成贡献,可以维护不造成贡献的点,算答案时减去其即为造成贡献的点。
复杂度 \(\mathcal{O}(n^2\log{V})\)。
树的结构是固定的,所以对于每个点 \(x\),其到根节点的所需序列是固定的,考虑 Hash,有修改,可以考虑线段树维护,对于一个询问 \([l,r]\),我们需要找到最大的 \(R\),使 \(ha_x + ha_{l,R}\) 在整棵树中出现过,直接二分是 \(\log^2{n}\) 的,我们考虑线段树上二分,对于线段树上节点 \(p\) 的区间 \([pl,pr]\),若 \(now + s_{p}\) 出现过,则往后查询,否则向下递归,并终止,\(now\) 是之前记录的 Hash 值,我们需要先递归左子树再递归右子树,复杂度 \(\mathcal{O}(\log{n})\)。
会卡 Hash,\(\mathrm{map}\) 常数较大,用 \(\mathrm{unordered\_map}\) 更好,总复杂度 \(\mathcal{O}(q\log{n})\)。
自我反思:先思考细节在敲代码,WA 了不要固定思维就是被卡 Hash,仔细检查 : (