Segment Tree 扫描线

算法数据结构——线段树(Segment Tree)实战:从RMQ到扫描线,Python代码全解析 本文深入解析线段树(Segment Tree)在算法与数据结构中的应用,从基础的RMQ问题到高级的扫描线算法,提供Python代码实现。涵盖区间查询、延迟标记、动态开点等核心技巧,适用于游戏开发、金融统计等场景,帮助开发者高效解决复杂区间问题。 阅读详情
#include<iostream>
#include<cstdio>
#include<algorithm> 
#define Max 1005
using namespace std;
struct line{
	double x, y1, y2;
	int flag;
}x_line[Max];

struct node{
	int l, r, flag;
	double x, f;
}tree[Max];

double point[Max];
int n, m, xm;

int cmp(double a,double b)
{
	return a<b;
}

bool comp(line a,line b)
{
    return a.x<b.x;
}

void Build(int l,int r,int k)
{
	int m;
	tree[k].l = l;
	tree[k].r = r;
	tree[k].flag = 0;
	tree[k].x = 0.0;
	tree[k].f = 0.0;
	if(l+1 == r)	return;
	m = (l+r)>>1;
	Build(l,m,k+k);
	Build(m,r,k+k+1);
}

void Myscanf()
{
	m = 1;
	double x1,x2,y1,y2;
	scanf("%d",&n);
	for(int i=0; i<n; i++)
	{
		scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
		point[m] = y1;
		x_line[m].x = x1;
		x_line[m].y1 = y1;
		x_line[m].flag = 1;
		x_line[m++].y2 = y2;
		point[m] = y2;
		x_line[m].x = x2;
		x_line[m].y1 = y1;
		x_line[m].flag = -1;
		x_line[m++].y2 = y2;
	}
}

void Point_Do()
{
	int mi = 0;
	sort(point+1,point+m,cmp);
	sort(x_line+1,x_line+m,comp);
	xm = m;
	for(int i=1; i<m; i++)
	{
		if(point[i]!=point[mi])		point[++mi] = point[i]; 		//去重
	}
	m = mi;
}

int Bin(int xi)
{
	int l = 1, r = m;
	int mi;
	while(l<=r)
	{
		mi = (l+r)>>1;
		if(xi = point[mi])	return mi;
		if(xi > point[mi])	l = mi+1;
		else r = mi-1;
	}
	return -1;
}

void update(int l, int r, int k, line cur)
{
	if(l==r-1)
	{
		if(tree[k].flag+cur.flag == 2)	tree[k].f = cur.x;
		else if(tree[k].flag+cur.flag<2 && cur.flag==-1){
			tree[k].x += cur.x - tree[k].f;
			tree[k].f = 0.0;
		}	
		return;
	}
	int mi = (tree[k].l+tree[k].r)>>1;
	if(l>mi)	update(l,r,k+k+1,cur);
	else if(r<=mi)	update(l,r,k+k,cur);
	else{
		update(l,mi,k+k,cur);
		update(mi+1,r,k+k+1,cur);
	}
	return;
}

double query(int k)
{
	if(tree[k].l+1==tree[k].r)	return (point[tree[k].l]-point[tree[k].r])*tree[k].x;
	return query(k+k)+query(k+k+1);
}

int Ans()
{
	for(int i=1;i<=xm;i++)
	{
		int x = Bin(x_line[i].y1);
		int y = Bin(x_line[i].y2);
		update(x,y,1,x_line[i]);
	}
}

int main()
{
	Myscanf();
	Point_Do();
	Build(1,n,1);
	Ans();
	printf("%lf\n",query);
	return 0;
}
Code From Hdu 1542
LintCode线段树/扫描线/查询题总结 线段树(Segment Tree)又叫区间树(Interval Tree),它实际上是一颗二叉树,北大的POJ上有关于这个高级数据结构的介绍:http://poj.org/summerschool/1_interval_tree.pdf LintCode上线段树专题下有这些题目: 阅读详情

相关推荐

扫描线算法:从矩形面积并到二维空间问题的高效解法

在计算几何和图形学中,处理二维平面上的空间覆盖与查询是常见需求。其核心原理是将复杂的二维静态问题,通过引入一条虚拟的扫描线,转化为一维的动态序列问题来处理。这种事件驱动和区间维护的思想,能将许多O(n²)复杂度的问题优化至O(n log n),极大地提升了算法效率,具有重要的技术价值。它广泛应用于图形渲染、碰撞检测、地理信息系统和VLSI设计等领域。本文以计算多个矩形覆盖总面积为切入点,深入剖析了扫描线算法的核心思想,并提供了基于std::map和线段树两种数据结构的C++实现,详细探讨了其性能差异与优化方

weixin_30340617的博客 409

青春野狼不做姐控偶像的梦 - 线段树 - 扫描线 - 单调栈

题目大意:给你一个排列,多次询问,每次给你一个区间,问有多少子区间,数字取出来sort一遍是连续的一段。 题解: 考虑l=1,r=n咋做。 考虑一段合法,当且仅当max-min=r-l。 那么用个单调栈预处理每个数字在哪些[l,r]会成为最大/最小值,然后扫描线维护max-min+l的最小值,显然由于[r,r]是答案所以能取到最小值的位置都一定是答案。 考虑整个问题,就是每次在所有最小值的位置+1...

Mys_C_K的博客 416

缺失的区间:范围合并与处理那些实战套路

本文介绍了区间处理的常见问题和实用解决方案。主要包括区间合并、查找缺失区间、区间集合运算(并/交/差)等典型场景。核心方法是先排序再贪心扫描,时间复杂度为O(n log n)。文章详细讲解了每种情形的处理思路,特别强调了端点约定和相邻区间合并等工程实践要点,并提供了完整的Python代码实现,包含合并、找缺口、求交集和差集等功能函数。适用于日程管理、IP地址块处理等需要区间运算的实际应用场景。

Echo_Wish 167

线段树+扫描线算法学习笔记

在求重叠矩形总周长或总面积时,可以用扫描线。一般要开一个结构体LINE,记两端的线段。

PLUS_CAT的博客 563

GIS国土工具实战:从地类分析到坐标转换,一站式解决项目难题

本文详细介绍了GIS国土工具在国土整治项目中的高效应用,涵盖地类分析、坐标转换、影像加载等核心功能。通过实战案例展示如何利用该工具快速处理shp与txt文件转换、智能比对三调二调数据,以及优化影像加载策略,显著提升项目效率。特别适合需要处理复杂国土数据的专业人员使用。

weixin_28732953的博客 334

COMSOL仿真避坑指南:列管反应器模拟中多孔介质与化学反应设置的5个常见错误

本文详细解析了COMSOL仿真中列管反应器模拟的5个常见错误,包括多孔介质模型选择、化学反应接口配置、对流扩散方程处理、薄层热阻设置及网格独立性验证。特别针对多孔介质与化学反应设置的误区,提供了实用的判断标准和修正方法,帮助工程师避免计算偏差,提升仿真精度。

weixin_29597551的博客 324

Hopping Rabbit---牛客

HHopping Rabbit 题意: 草原上(看成二维坐标系)有n个矩形形状的陷阱,一只兔子在草原上蹦来蹦去。如果兔子在(x,y)(x,y),它跳一次后在(x+d,y),(x-d,y),(x,y+d),(x,y-d)四个点中的一个。问在坐标系中是否存在一个点使兔子无论怎么跳都不会掉进陷阱 。 思路: 把整个草原切分成若干块边长为d的正方形,兔子在每一个正方形上只有一个落脚点(这里要分类讨论,一个陷阱被切分成了多少块)。所以可以把所有的陷阱矩形都看做是在坐标轴的[0,d−1]×[0,d−1]位...

qq_51662872的博客 447

命令行驱动视频剪辑:cutcli与AI自动化工作流实战

在视频内容创作领域,自动化与批量化处理是提升生产效率的关键。传统图形界面工具在应对重复性任务时往往效率低下,而通过命令行接口(CLI)驱动视频生成,则能实现流程的程序化控制。其技术原理在于将视频结构抽象为可编程的指令序列,通过解析命令生成标准化的工程文件。这种模式的核心价值在于将视频制作从手动操作转变为代码驱动,特别适合与AI编程助手集成,实现自然语言到视频草稿的自动转换。应用场景广泛覆盖社交媒体内容批量生产、教育视频自动化生成、数据可视化视频组装等领域。本文以cutcli工具为例,深入解析如何通过命令行与

weixin_42520239的博客 577

P1502 窗口的星星

Link lydp221 思路 一开始没考虑在边界的情况。。不知道为什么ac了。。。 1.矩形边界上的星星不算,可以采用把所有星星向左、下各平移0.5距离(因为坐标都是整数),在此基础上,不妨假设圈住星星的矩形顶点坐标都是整数。 2.对扫描线排序的时候,除了以 xxx 为第一关键字升序之外,还需要以 vvv 为第二关键字降序。 代码 struct Segment { ll up, down, x; ll v; Segment(ll l=0, ll r=0, ll h=0,ll v =

Strezia的博客 727

AG16K MCU ARM Cortex M3

其中,Input文件为Keil生成的mcu程序文件,输出为合成后的存储格式Bin文件,Program address 为上方表格中“程序运行 RAM 地址(4bytes)”,即 Keil 中设置的程序运行地址。其中 MCU 程序的地址,根据 mcu.ip 中设置的 FLASH_BIAS 进行设置。AG16K MCU 的 FPGA 工程中,需调用 alta_mcu_m3 的硬核 IP,包含在 alta_sim.v 的库文。Quartus II。//MCU 程序在 FLASH 中存放的首地址。

Embeded_FPGA的博客 1806

攻克Windows平台3DGS复现:从环境配置到可视化实战全记录

本文详细记录了在Windows平台成功复现3D Gaussian Splatting(3DGS)的完整流程,涵盖从环境配置、依赖安装、数据准备到模型训练与可视化的全步骤。重点解决了Windows下CUDA版本匹配、Visual Studio编译及SIBR_viewers可视化工具部署等核心难题,为开发者提供了一份详实的避坑指南与实战手册。

weixin_28839699的博客 252

线段树 (Segment Tree) 完全指南

线段树(Segment Tree)是一种对线性空间的"二进制拆分"思想。如果说前缀和是利用了加法的逆运算,那么线段树就是利用了结合律的终极武器。 线段树的本质是分治法(Divide and Conquer)在空间上的持久化。 结合律意味着计算顺序可以被改变,从而允许我们将线性的计算重组为树形结构。如果直接操作不满足结合律(如"求众数"),就需要构造更复杂的信息结构使其满足(如摩尔投票法的合并)。所有的线段树高级技巧(Level 1-6),本质上都是在寻找或构造这个结合律。

lifallen的博客 1142

从 Claude Code 到 SAP ADT,vibing-steampunk 把 ABAP 开发带进 Agentic 工程现场

vibing-steampunk(vsp)是一个连接SAP ADT API与AI编码代理的桥梁工具,通过MCP协议实现ABAP开发的自动化。它绕开传统GUI脚本方式,直接利用ADT REST API进行代码读写、调试和部署。该工具提供包分析、边界检查、LUW分析等功能,并创新性地采用Hyperfocused模式和方法级编辑来优化token使用效率。通过上下文压缩技术,vsp能智能提取关键代码片段,显著提升AI处理ABAP代码的精准度,为SAP系统现代化改造提供了高效的技术路径。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 190

Segment Tree——线段树入门

线段树是一种基于分治思想的二叉树结构,用于在区间上进行统计。每个节点代表一个区间,对于每个内部节点[l,r](编号p),左子节点代表区间[l,mid](编号p2),右子节点代表区间[mid+1,r](编号p2+1).可以用结构体数组保存一棵线段树,数组大小开到N*4 P2068 统计和 定义线段树 struct segment_tree { int l,r; long long sum; }tree[100010*4]; 建树 void build(int p,int l,int r) { tre

春弦的博客 502

Hermes Agent 彩蛋大盘点:藏在终端里的浪漫

本文主要介绍了Hermes Agent 彩蛋大盘点:藏在终端里的浪漫,希望能对使用Hermes Agent的同学们有所帮助。 文章目录 1. 前言 2. Spinner 动画 3. Kawaii 表情 4. 思考动词 THINKING_VERBS 5. 皮肤主题 6. 启动 Banner 7. 工具 Emoji 8. 内置人格 9. SOUL.md —— Agent 的灵魂 10. BOOT.md —— 启动自动执行 11. 随机 Tips 12. 统计总览

weixin_43178406的博客 7万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution

LG P9844 Solution

pystraf的博客 486

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

线段树(Segment Tree)

应用场景线段树类型区间和/最值 + 单点修改基础线段树区间和/最值 + 区间修改懒标记线段树值域大、操作少动态开点线段树区间第k小、历史版本主席树矩形面积并、周长并扫描线 + 线段树区间最值操作(chmin/chmax)吉司机线段树线段树是竞赛中最灵活的数据结构之一,掌握其核心思想(分治、懒标记)后,可以根据题目需求自由变形。

cjr_xyi的博客 2495

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

扫描线算法与线段树:高效解决矩形奇偶覆盖面积问题

在计算几何与算法竞赛中,处理二维平面上的矩形覆盖统计问题是一个经典挑战。其核心原理是通过扫描线算法将二维问题降维,转化为对一维区间的动态维护。线段树作为一种高效的数据结构,能够支持区间修改与快速查询,是实现这一过程的关键技术。结合离散化技术处理大范围坐标,该组合方案能将时间复杂度优化至O(N log N),有效解决了暴力枚举法在坐标范围大、矩形数量多时的性能瓶颈。这一技术方案在算法竞赛(如蓝桥杯国赛)和工程实践中(如传感器网络覆盖分析、图形学区域填充)有重要应用,尤其适用于需要统计被奇数个矩形覆盖的区域面积

weixin_34146805的博客 498

坐标系旋转 + 扫描线(一个长宽固定的矩阵最多覆盖多少点)

坐标系旋转

gkajvsbja的博客 162

算法数据结构——线段树(Segment Tree)精讲及python实现

算法数据结构——线段树(Segment Tree)精讲及python实现

学习中 1373

线段树(Segment Tree)在Python中的高效实现与应用场景解析

本文深入解析了线段树(Segment Tree)这一高效处理区间操作的数据结构。通过Python代码示例,详细讲解了其构建、单点更新、区间查询的核心原理,并重点剖析了实现高效区间修改的关键技术——懒惰标记(Lazy Propagation)。文章结合具体应用场景,阐述了线段树在解决区间求和、最值查询等问题上的优势与适用边界,为开发者处理海量数据区间操作提供了实用指南。

pandas7gardener的博客 543

Handbook of Data Structures and Applications学习: Range, and Interval, Segment, Priority S Search Tr

假设你在做一个会议室预约系统。每个预约是一个时间区间(比如9:00-10:30)。 你需要高效回答这些问题: 暴力方法: 对每个查询遍历所有预约 → O(n)O(n)O(n),太慢。 本章介绍的四种数据结构可以将这些查询加速到 O(log⁡n)O(\log n)O(logn) 级别。 二、核心概念:等轴矩形与矩形相交图 2.1 等轴矩形(Iso-Oriented Rectangles) 2.2 矩形相交图与最大团 矩形相交图: 每个矩形是一个顶点,如果两个矩形相交则连一条边。 2.3 一维情况:区间图与密

虾球 432

HDU1542 Atlantis(扫描线+矩形面积并+线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 题意:给出一些矩形,求面积并。 从左到右扫描,纵坐标排序后,按数组下标建树,插入纵线段端点再映射到原数,别的就没什么了。 参考代码: #include #include #include #include #include #include using namespace std

fire__ice的专栏 1010

【数据结构系列】线段树(Segment Tree)

【数据结构系列】线段树(Segment Tree)

xiaoyao24256的博客 753

2.线段求交

几何算法,线段求交

x13262608581的博客 1124
上一篇: Segment Tree
下一篇: Binary Indexed Tree
梁千仞
博客等级 码龄15年 12粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值