博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树
阅读量:4978 次
发布时间:2019-06-12

本文共 1604 字,大约阅读时间需要 5 分钟。

扫描线:

给定一些点及其权值,一个大小拟定的矩阵能得到的最大值

做法:每个点看作一个矩阵(该点为左上角),拟定矩阵的右下角在这块区域内能得到该点的贡献

\(y\)坐标降序,每个点化作矩阵上下两点,线段树往下扫,点则控制\(x\)范围的值,达到上点加上去,到达下点减掉

简单思路,处理麻烦

优化建边

差分约束+线段树

模拟

查询烂大街,结合\(hall\)定理,查询易错点

(经典贪心)

做法:\(st\)表倍增,离散化坐标,\(right[i][j]\)表示\(i\)坐标往前不重叠长度最小的距离

\(query(l,r)\)表示\([l,r]\)区间的线段能选的最大数量,

设现在选择\((l,r)\)这条线段,\((l_0,r_0)\)为已经确定的图中\((l,r)\)往外扩展的空区间,则能选择这条线段的条件为:\[query(l_0,r_0)=query(l_0,l-1)+1+query(r+1,r_0)\]

分类偏序(是求每次的最短距离)

标记永久化动态插入一次函数,查询\(x\)的最高点

字典序\(k\)小最长上升子序

由于字典序,所以倒叙做(转换为下降),\(f[i]\)为倒序\(i\)结尾的最长长度,\(g[i]\)为方案数,至于差值限制线段树解决
\(k\)小则倒叙,\(g[i]≥k\)则选\(i\)否则不选\(k-g[i]\)

推式子

模拟分治

一棵树,动态添加删除操作\((u,v,w)\),查询与\(u\)无交的最大值\(w\)
做法:\((u,v,w)\)时树剖提出\(u,v\)的子路径,除外的路径线段树添上\(w\),每个点套个可删\(heap\)不需要下传

枚举分割线

做法:\(\sum\limits_{l≤i≤r}dep[lca(i,z)]\)朴素就是\({l≤i≤r}\)中根~\(i\)路径\(+1\)\(z\)往上爬,累加路径和为答案
\(~~~\)优化:每个查询排序离线,前缀和相减,扫描线进点

合并

给定一棵树,只有叶子节点有权值,可任意将某个节点\(ls,rs\)交换,求若干次交换后树前序遍历排叶子节点,逆序对能达到的最小值

做法:因为是前序遍历,\(ls,rs\)交换,对除这棵子树外的节点无任何影响,对每棵叶子节点开值域线段树,不断往上合并

每次统计逆序对(\(ls\)内,跨\(mid\),\(rs\)内),跨\(mid\)则通过线段树合并的过程求出

线段树合并+差分

树从下到上直接合并,模拟贡献

差分合并

序列区间操作

给定一个序列,每次操作把\((l,r)\)中小于\(h\)或大于\(h\)的数改成\(h\),求最终序列

两个懒惰标记\((add,del)\)意思同上,分情况讨论传递标记(乍看不可做,想一下怎么推重复标记就懂了)

\(01\)序列,每次拿出一个\((l_0,r_0)\)中所有的\(1\)并清空,补上\((l_1,r_1)\)中前缀\(0\)(不连续),多余的不管,查询\((l,r)\)最长连续\(1\)长度

查询烂大街了,补上:二分能补上的区间,区间赋值

求区间\((l,r)\)众数(大于区间长度一半),带修改

求不修的一棵主席树就够了,带修改要用到摩尔投票法(即减掉两个不同的数,最后剩下的相同数则为众数(还要判断是否大于区间长度一半))

即线段树维护\(cnt\)(最后剩下的数的个数)即可以求出众数,再平衡树(位置)验证是否为真正的众数

经典的单点贡献操作题(注意是全排列)

简单更新+最长上升子序

展开(思路明显),标记麻烦

展开时间戳(思路不明显),标记麻烦

\((l,r)\)中子区间异或和,经典线段树区间套区间(跨区间)操作

经典点对贡献(主要在于线段树控制范围)

维护历史最大值

转载于:https://www.cnblogs.com/y2823774827y/p/10351422.html

你可能感兴趣的文章