线段树是一种用于高效区间修改与查询的二叉树结构,每个节点存储区间信息,通过递归建树、合并左右儿子信息实现维护。支持单点更新和区间查询,查询时若区间完全覆盖则直接返回,否则递归合并。扩展引入懒标记优化区间修改,延迟更新以保持复杂度为O(logN),并给出维护区间最值及最大子段和的实现示例。

阅读全文 »

ST表用于快速求区间最值(RMQ),设f[i][j]表示区间[i,i+2^j-1]最大值,预处理f[i][0]=a[i],递推式为f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1])。查询区间[l,r]时令k=log2(r-l+1),答案为max(f[l][k],f[r-2^k+1][k]),代码使用二维数组预处理好后O(1)回答查询。

阅读全文 »

前缀和用于快速求区间和,一维前缀和简单;二维前缀和通过容斥原理定义f[i][j]为左上角到(i,j)的矩阵和,递推式为f[i][j]=a[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1],查询(x1,y1)到(x2,y2)的和用f[x2][y2]-f[x1-1][y2]-f[x2][y1-1]+f[x1-1][y1-1],代码中由随机数生成矩阵并多次查询异或答案。

阅读全文 »

树上LCA通常用倍增法实现,预处理每个节点向上跳2的幂次到达的祖先节点,通过递推式f[i][j]=f[f[i][j-1]][j-1]构建倍增表,同时用DFS记录深度和父节点。查询时将两点调整到同一深度,再一起向上跳至祖先不同为止,最终父亲即为最近公共祖先。预处理时间复杂度O(n log n),单次查询O(log n)。代码采用vector存图,按模板P3379实现。

阅读全文 »
0%