线段树

扫描线:

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

做法:每个点看作一个矩阵(该点为左上角),拟定矩阵的右下角在这块区域内能得到该点的贡献
(y)坐标降序,每个点化作矩阵上下两点,线段树往下扫,点则控制(x)范围的值,达到上点加上去,到达下点减掉

P3415
简单思路,处理麻烦

优化建边

P3588
差分约束+线段树

模拟

思维题
查询烂大街,结合(hall)定理,查询易错点AC40

区间不重叠线段最大数(经典贪心)

做法:(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)$$

code

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

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

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

推式子P3488

模拟分治P4062

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

P3644
枚举分割线

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

合并

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

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

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

code

P4556
线段树合并+差分

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

P4577
差分合并

序列区间操作

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

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

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

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

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

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

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

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

P3722
简单更新+最长上升子序

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

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

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

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

P4247
解法

4314
维护历史最大值
解法

原文地址:https://www.cnblogs.com/y2823774827y/p/10351422.html