线段树

扫描线:

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

做法:每个点看作一个矩阵(该点为左上角),拟定矩阵的右下角在这块区域内能得到该点的贡献
\(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
做法:\(\sum\limits_{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
维护历史最大值
解法

posted @ 2019-05-21 14:44  y2823774827y  阅读(201)  评论(0编辑  收藏  举报