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

基于deepseek+dify+达梦实现自然语言查询数据库

自然语言查询数据库信息

weixin_43974943的博客 1593

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 262

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

MacOS下Mixly 2.0安装避坑指南:从Java环境到终端权限全解析

本文详细解析了在MacOS系统上安装Mixly 2.0时可能遇到的核心问题与解决方案。针对Java环境版本不兼容、MacOS Gatekeeper安全机制拦截以及终端权限不足三大常见障碍,提供了从检查并配置正确Java版本、安全设置绕过到彻底解决应用内部工具链权限的完整避坑指南,帮助用户顺利完成安装并正常使用。

weixin_29231725的博客 503

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

Diffusion、VAE与GAN:三大生成模型的原理对比与应用场景解析

本文深入解析了Diffusion、VAE与GAN三大生成模型的核心原理与特性。Diffusion模型通过逆向去噪过程实现高质量图像生成,但计算成本较高;VAE擅长学习概率潜空间,训练稳定但图像偏模糊;GAN通过对抗训练生成锐利图像,但存在模式崩溃风险。文章结合实战场景,为图像生成、修复、超分辨率等任务提供了清晰的模型选择指南。

weixin_29063979的博客 344

FunASR与FreeSWITCH融合实战:从零构建高精度语音质检系统

本文详细介绍了如何将FunASR与FreeSWITCH融合,构建高精度语音质检系统。通过实时语音听写技术,结合热词定制和多模型切换,实现客服中心等场景的自动化质检,显著提升识别准确率和效率。系统架构涵盖音频采集、识别处理和业务应用三层,支持负载均衡和性能优化,适用于工业级部署。

weixin_29198045的博客 980

线段树 (Segment Tree) 完全指南

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

lifallen的博客 1142

C/C++小宇宙代码(完整代码)

C语言实现小宇宙的完整代码。

AIGC 2523

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

SPI为什么不需要加上拉电阻

大家好,我是记得诚。I2C因为其开漏的结构,无法输出高电平,所以外部加上拉电阻。我们在使用SPI的时候,发现是不需要加上拉电阻的。主要因为SPI多为推挽的结构,推挽电路,高低电平都可以输出,所以外部不需要加上拉电阻。推挽电路可以用2个三极管或者2个MOS管搭建而成。

记得诚 2629

财务数智化——解读224页 2025年数智技术业财融合应用蓝皮书【附全文阅读】

《数智技术赋能业财融合蓝皮书》面向企业管理者及数字化转型从业者,系统阐述数智技术在业财融合中的应用。全书围绕技术基础(定义、分类、发展趋势)、融合框架(三阶段路径与三层价值)、七大行业应用场景(涵盖核算自动化、智能收款、项目管控等)、关键技术(AI、大数据等)及实施要点(组织协同、数据治理等),通过典型案例为企业提供从技术到实践的全面指导,助力实现数据贯通与价值创造。

cdfunlove的博客 1747

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

LG P9844 Solution

pystraf的博客 486

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

线段树(Segment Tree)

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

cjr_xyi的博客 2495

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

weixin_34146805的博客 498

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

坐标系旋转

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、付费专栏及课程。

余额充值