首页 > 其他分享 >【学习笔记 / 数据结构】线段树进阶

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

时间:2023-01-08 11:13:36浏览次数:66  
标签:数据结构 进阶 线段 texttt le 扫描线 y1 y2

扫描线

【洛谷模板题传送门】

思想

以一条法线从下往上扫描整个图形,图形面积并即为 \(\sum\limits_{i=1}^{n-1} len_i \times \left(h_{i+1}-h_i\right)\),其中 \(len_i\) 为当前扫描线长度,\(h_k\) 为编号为 \(k\) 的线段的 \(y\) 坐标。

图示

如图:

\(\texttt{Step 1:}\)

从头开始扫。

\(\texttt{Step 2:}\)

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

\(\texttt{Step 3-4}\)

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

动态开点

【例题】:HDU6183 - Color it!

题意:给出以下操作:

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

数据保证 \(n,m \le 10^6,0\ge c \le 50,y1 \le y2\)。

思路

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

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

可持久化线段树 / 主席树

【洛谷模板题传送门】

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

使用动态开点。

大概长这样:

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

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


所有笔记的代码:

画图软件:

  • \(\text{Microsoft Whiteboard}\)

编辑器:

  • \(\text{CP Editor / Dev-C++}\)

标签:数据结构,进阶,线段,texttt,le,扫描线,y1,y2
From: https://www.cnblogs.com/TheSky233/p/17034255.html

相关文章

  • 【Unity TIL】6. 如何判断两条线段是否相交
    AABB碰撞检测,也就是轴对齐碰撞检测,用平行于x,y轴的矩形表示物体。如何判断两个矩形是否相撞,可以通过分别判断x,y轴上的线段是否相交。假设线段分别为(s1,e1),(s2,e2),判......
  • 牛客进阶题目11:非重叠的序列检测
    可以用状态机也可用移位寄存器注意题目给rst的命名不带n后缀,但其实还是下降沿触发`timescale1ns/1nsmodulesequence_test1( inputwireclk, inputwirerst,......
  • 牛客进阶刷题10:整数倍数据位宽转换8to16
    比非整数倍简单`timescale1ns/1nsmodulewidth_8to16( input clk , input rst_n , input valid_in , input [7:0] data_in ,......
  • 牛客进阶刷题9:非整数倍数据位宽转换8to12
    输入位宽8bit,输出位宽12bit,也就是说每三个输入数据可以生成两个完整输出。注意给出的波形是data_lock而不是data_in,这是陷阱。data_lock是data_in打了一拍的结果。用一......
  • 牛客进阶刷题8:非整数倍数据位宽转换24to128
    第一阶段:120bit+8bit第二阶段:16bit+96bit+16bit第三阶段:8bit+120bit所以相当于发送了16个24bit数据,作为一个循环。第6、第11两个数据被拆开使用。根据上述分析可知,缓存......
  • 二分查找进阶版
    一、题目时间限制:500ms空间限制:64MB很久以前,有位同学,在学完算法课的二分后,激动的振臂高呼:“我学会二分了!”。此时,一位学长从旁边经过听到此话,决定出一道题考考他,挫挫同学的......
  • 自定义数据类型:结构体(C语言进阶)
    结构体类型的声明结构体的自引用结构体内存对齐结构体传参自学b站“鹏哥C语言”笔记。一、结构体类型的声明详见文章【初识结构体】第一部分。补充说明:匿名结构体类型:省略结......
  • 数据的存储(C语言进阶)
    数据类型介绍内置数据类型的归类整型在内存中的存储:①原码、反码、补码②大小端字节序③char的存储内容浮点型在内存中的存储自学b站“鹏哥C语言”笔记。一、数据类型介绍......
  • 指针详解(C语言进阶)
    字符指针指针数组自学b站“鹏哥C语言”笔记。本章笔记不全。回顾:在文章【初识指针】中,我们已经了解到的指针概念有指针是一种变量,用来存放地址,地址唯一标识一块内存空间。指......
  • 【C语言 数据结构】二叉树
    文章目录​​二叉树​​​​一、二叉树的概念​​​​二、二叉树的基本形态​​​​三、二叉树的性质​​​​四、特殊的二叉树​​​​五、二叉树的存储结构​​​​5.1......