杂题选练

一些杂题但可以记录下的。

I P5300 [GXOI/GZOI2019] 与或和

首先我们拆位,然后枚举每一个点 \((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})\)

代码

II P5537 【XR-3】系统设计

树的结构是固定的,所以对于每个点 \(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,仔细检查 : (

代码

posted @ 2024-10-05 09:12  oXUo  阅读(7)  评论(0编辑  收藏  举报
网站统计