首页 > 其他分享 >线段树合并

线段树合并

时间:2025-01-16 20:23:11浏览次数:1  
标签:连通 线段 合并 信息 ls define

简介

将多棵线段树的信息统一起来的高效算法称之为线段树合并。

通常合并顺序呈树状结构。

例题

P3224 [HNOI2012] 永无乡

假设所有点都在一个连通块里,那么我们只需要维护一个值域线段树并在上面二分即可。

但此时图不连通,我们该如何快速的统计信息呢?

对于连边,并查集可以胜任。

对于信息的合并,首先考虑新开一个寄存线段树。

显然是不行的,时空双爆。

由于一个线段树不一定像堆式建树一样全部建满的,我们可以考虑动态开点。

那么就很好办了,分别合并线段树的左右儿子,没右跑左,没左跑右,时间复杂度是线段树的深度 \(O(\log n)\)。

线段树代码:

namespace SGT {
	#define mid ((L + R) >> 1)
	#define son p, L, R
	#define lson ls[p], L, ((L + R) >> 1)
	#define rson rs[p], (((L + R) >> 1) + 1), R
	
	int tot, ls[N << 5], rs[N << 5];
	struct Node {
		int sum;
	} t[N << 5];
	
	inline void modify(int x, int &p, int L = 1, int R = n) {
		if(! p) p = ++ tot;
		
		t[p].sum = 1;
		
		if(L == R) return ;
		
		if(x <= mid) modify(x, lson);
		else modify(x, rson);
		
		return ;
	}
	
	inline int query(int k, int &p, int L = 1, int R = n) {
		if(L == R) return L;
		
		if(k <= t[ls[p]].sum) return query(k, lson);
		else return query(k - t[ls[p]].sum, rson);
	}
	
	inline int merge(int x, int y) {
		if(! x) return y;
		if(! y) return x;
		
		ls[x] = merge(ls[x], ls[y]);
		rs[x] = merge(rs[x], rs[y]);
		
		t[x].sum += t[y].sum;
		
		return x;
	}
	
	#undef mid
	#undef son
	#undef lson
	#undef rson
}

标签:连通,线段,合并,信息,ls,define
From: https://www.cnblogs.com/endswitch/p/18675696

相关文章

  • 洛谷题单指南-线段树的进阶用法-P3168 [CQOI2015] 任务查询系统
    原题链接:https://www.luogu.com.cn/problem/P3168题意解读:一个任务管理系统,能够查询在某个时间点运行的任务中优先级最小的k个任务的优先级之和。解题思路:由于总时间n不超过100000,考虑针对所有时刻建立可持久化线段树,根节点为root[i]的线段树维护时刻i的任务情况,节点区间表示......
  • 洛谷题单指南-线段树的进阶用法-P2617 Dynamic Rankings
    原题链接:https://www.luogu.com.cn/problem/P2617题意解读:动态求区间第k小问题。解题思路:树套树的典型应用,具体阐述参考:https://www.cnblogs.com/jcwy/p/18640914100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=100005;structOp{charop;......
  • 解题报告-论对“线段树思想”的新理解
    解题报告-论对“线段树思想”的新理解一晚上刷了两个线段树知识点,也是见识到了线段树世界的博大精深。我们发现无论怎么写线段树,大体框架都是一样的。那么为什么有那么多种线段树呢?一个是线段树标记的不同。在李超线段树中,每个结点维护的是当前结点最上面那条线的编号,于是更新......
  • 线段树学习笔记
    什么是线段树线段树是一种基于分治思想的二叉树结构,用于在区间上进行信息统计,比树状数组更为通用、直观,支持单点修改、区间修改、区间查询。线段树维护的数据具有可并性,比如区间和、区间积、区间最值等等。模板建树voidbuild(intl,intr,intp){ tre[p].l=l;tre[p].r=r;......
  • LeetCode:21.合并两个有序链表
    LeetCode:21.合并两个有序链表解题思路与归并排序中的合并两个有序数组很相似。将数组替换成链表就能解此题。解题步骤新建一个新链表,作为返回结果。用指针遍历两个有序链表,并比较两个链表的当前节点,较小者先接入新链表,并将指针后移一步。链表遍历结束,返回新链表。/***Defini......
  • 算法题(36):合并区间
    审题:需要把区间兼容的区间合并起来,并存入二维数组中返回思路:由于数据是乱序的,我们直接进行判断会很麻烦,所以我们先对区间的左边界进行升序排序,这样子可以保证数据被分成一个个连续区间,只需要按顺序遍历判断即可。判断逻辑:answer二维数组作为返回数组。首先我们把第一个......
  • 线段树【区间GCD】
    https://codeforces.com/contest/2050/problem/F#include<bits/stdc++.h>#definelcp<<1#definercp<<1|1#defineINF2e9usingnamespacestd;#definelowbit(x)x&(-x)#defineendl'\n'usingll=longlong;usingpii=pair......
  • Pandas数据合并:concat与merge
    目录一、concat方法1.基本语法2.示例示例1:按行合并(垂直方向)示例2:按列合并(水平方向)示例3:使用join='inner'进行内连接示例4:处理列名冲突二、merge方法1.基本语法2.示例示例1:内连接(InnerJoin)示例2:外连接(OuterJoin)示例3:左连接(LeftJoin)示例4:右连接(RightJoin)......
  • 3.4 Pandas 数据合并和连接:掌握数据整合的核心技巧
    3.4Pandas数据合并和连接:掌握数据整合的核心技巧在实际的数据分析工作中,数据往往分散在多个数据源中。为了进行全面的分析,我们需要将这些数据合并或连接在一起。Pandas提供了强大的工具来实现数据的合并和连接操作。本文将详细介绍如何使用Pandas进行数据合并和连接,帮......
  • 【Python】拆分、合并PDF
    1.拆分#importsys#sys.path.append(r"c:\users\lenovo\appdata\local\programs\python\python312\lib\site-packages")#这里包的安装目录不同,将其加入系统变量,目录相同不需要这个fromPyPDF3importPdfFileWriter,PdfFileReaderinput_pdf=PdfFileReader(r"F:\需要拆分......