【学习笔记 / 数据结构】线段树进阶

1|0扫描线

【洛谷模板题传送门】

1|1思想

以一条法线从下往上扫描整个图形,图形面积并即为 i=1n1leni×(hi+1hi),其中 leni 为当前扫描线长度,hk 为编号为 k 的线段的 y 坐标。

1|2图示

如图:

Step 1:

从头开始扫。

Step 2:

扫到第二条,计算浅蓝色部分面积。

Step 3-4

扫描线当前长度可以用线段树优化(区间修改)。

2|0动态开点

【例题】:HDU6183 - Color it!

题意:给出以下操作:

  • 0,代表清空所有颜色。
  • 1 x y c 代表在坐标 (x,y) 涂上第 c 种颜色。
  • 2 x y1 y2 代表统计 x 轴上 (1,x)y 轴上 (y1,y2) 的颜色数,一个点可以有多种颜色.
  • 3 代表结束。

数据保证 n,m106,0c50,y1y2

2|1思路

50 棵线段树维护当前颜色 y 坐标上最小的 x,查询 (x,y1,y2) 时,看那个颜色的线段树 (y1,y2) 区间的值是否 x 即可。

因为空间会爆炸,所以不能常规开线段树,用到什么区间就开那个区间的内存即可。

3|0可持久化线段树 / 主席树

【洛谷模板题传送门】

主席树即为可持久化权值线段树,即在保留历史版本的前提下更新线段树,分析可得,修改的节点是一条链且必然产生新的根,未修改的连到过去版本即可。

使用动态开点。

大概长这样:

i 棵主席树保存的是离散化后 [1,i] 出现的次数。

区间查询时,运用前缀和的思想确定左右区间,递归求解。


所有笔记的代码:

画图软件:

  • Microsoft Whiteboard

编辑器:

  • CP Editor / Dev-C++

__EOF__

本文作者TheSky233
本文链接https://www.cnblogs.com/TheSky233/p/17034255.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TheSky233  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示