线段树

线段树详解 (原理,实现与应用) 线段树详解 By 岩之痕 一:综述 线段树是一种可以快速进行区间修改和区间查询的数据结构。点修改,区间修改和区间查询的复杂度都是O(log2(n)) 并且,线段树可以维护很多种类的信息。说到线段树就不得不提一下树状数组,树状数组维护的信息必须满足区间减法,因为树状数组只是维护1到X的信息,通过相减来得到区间信息,代码简单而且速度快,占用空间又少于线段树,所以一般情况下可以用树状数组的地方就 阅读详情

线段树是一种基础且强大的数据结构,修改与查询均为log2(n),是十分优秀的数据结构,下面展示了线段树的几种常见用法:

1)单点修改:

这个就不多说了,直接上代码

struct Tree{
	int l,r;//区间
	int ls,rs;//左右儿子编号
	int sum;//需维护的答案,这里是维护区间和 
}; 
//结构体的定义可根据自身喜好决定是采用直接建树或者动态开点 
/***************************************************/
inline void pushup(int v){t[v].sum=t[v*2/ls].sum+t[v*2+1/rs].sum;} 
void build(int v,int l,int r){//直接建树 
	tree[v].a=l;tree[v].b=r;tree[v].c=0;//初始化,定界 
   	if(l==r)return;
   	int mid=(l+r)/2;
   	build(2*v,l,mid);
	build(2*v+1,mid+1,r);
}
void Add(int v,int x,int d){
	if(x<tree[v].a||x>tree[v].b)return;
   	if(x>=tree[v].a&&x<=tree[v].b)return tree[v].c=tree[v].c+d,void();//单点修改 
   	Add(2*v,x,d);
	Add(2*v+1,x,d);
	pushup(v);
}
void Ask(int v,int L,int r){
	if(r<tree[v].a||L>tree[v].b)return;
   	if(L<=tree[v].a&&r>=tree[v].b){Ans+=tree[v].c;return;}
   	Ask(2*v,L,r);
	Ask(2*v+1,L,r);
}
/***************************************************/
inline void insert(int &v,int l,int r,int k,int val){//这里是采用动态开点,与上来就建一整颗线段树相比,能节省(很多)空间 
	if(l>k||r<k)return ;
	if(!v)v=++cnt;
	if(l==k&&r==k)return t[v].sum+=val,void();
	int mid=l+r>>1;
	insert(ls,l,mid,k,val),insert(rs,mid+1,r,k,val);
	pushup(v);
}
inline int query(int v,int l,int r,int A,int B){
	if(l>B||r<A)return 0;
	if(A<=l&&r<=B)return t[v].sum;
	int mid=l+r>>1;
	return query(ls,l,mid,A,B)+query(rs,mid+1,r,A,B);
}

2)区间修改(下传标记优化):

Description

  在数轴上进行一系列操作。每次操作有两种类型,一种是在线段[a,b]上涂上颜色,另一种将[a,b]上的颜色擦去。问经过一系列的操作后,有多少条单位线段[k,k+1]被涂上了颜色。

Input

  第1行:2个整数n(0<=n<=60000)和m(1<=m<=60000)分别表示数轴长度和进行操作的次数。
  接下来m行,每行3个整数i,a,b, 0<=a<=b<=60000,若i=1表示给线段[a,b]上涂上颜色,若i=2表示将[a,b]上的颜色擦去。

Output

  文件输出仅有一行为1个整数,表示有多少条单位线段[k,k+1]被涂上了颜色。

Sample Input

10 5

1 2 8

2 3 6

1 1 10

2 4 7

1 1 5

Sample Output

7

 不难想到将整个将每次修改分为n次单点修改,但在一些动态操作下时间效率太低且不好实现,因此,对线段树的优化势在必行!!!

我们发现,一段区间的修改只会被自身和祖先的修改所影响,由此可以想到一个优化方法是:打标记。

何谓标记?对于本题而言,我们设置一个col标记表示是否被涂色(1为上色,-1为删除),那么本题的执行过程如下:

1)每次读入命令后,判断是修改(转到2)或是查询(转到4)

2)标记下传给左右儿子,然后继续递归直到完全包含,转到3

3)区间修改,修改后返回

4)标记下传给左右儿子,然后继续递归直到完全包含,转到5

5)区间统计,返回

还是通过代码更好的理解(代码下面有段解释,可以配合着看):

#include<bits/stdc++.h>
using namespace std;
inline int get(){register int re=0,f=1;register char c;while(c=getchar(),(c>='0'&&c<='9')^1)f=c^'-';while(re=(re<<1)+(re<<3)+(c^48),c=getchar(),(c>='0'&&c<='9'));return f?re:-re;}
const int N = 1e5+10;
#define FOR(i,L,R) for(register int i=(L);i<=(R);++i)
#define REP(j,R,L) for(register int j=(R);j>=(L);--j)
struct linetree{int l,r,s,co;}a[maxn*4];
int n,m;
void build(int v,int l,int r){
	a[v].l=l;a[v].r=r;a[v].s=0;a[v].co=0;
	if(l==r)return ;
	int mid=(l+r)>>1;
	build(2*v,l,mid);
	build(2*v+1,mid+1,r);
}
void color(int v,int l,int r){//添加 
	if(a[v].l>r||a[v].r<l)return;
	if(a[v].co==1)return;
	if(l<=a[v].l&&r>=a[v].r){a[v].s=a[v].r-a[v].l+1;a[v].co=1;return;}
	if(a[v].co==-1){
		a[(v<<1)].s=a[(v<<1)+1].s=0;
		a[(v<<1)].co=a[(v<<1)+1].co=-1;
		a[v].co=0;
	}
	color((v<<1),l,r);
	color((v<<1)+1,l,r);
	a[v].s=a[(v<<1)].s+a[(v<<1)+1].s;
}
void colo_(int v,int l,int r){//删除 
	if(a[v].l>r||a[v].r<l)return;
	if(a[v].co==-1)return;
	if(l<=a[v].l&&r>=a[v].r){a[v].s=0;a[v].co=-1;return;}
	if(a[v].co==1){
		a[(v<<1)].co=a[(v<<1)+1].co=1;
		a[(v<<1)].s=a[(v<<1)].r-a[(v<<1)].l+1;
		a[(v<<1)+1].s=a[(v<<1)+1].r-a[(v<<1)+1].l+1;
		a[v].co=0;
	}
	colo_((v<<1),l,r);
	colo_((v<<1)+1,l,r);
	a[v].s=a[(v<<1)].s+a[(v<<1)+1].s;
}
void solv(){
	n=get();m=get();
	build(1,1,n);
	int l,r,od;
	while(m--){
		od=get();l=get();r=get();--r;
		if(od==1)color(1,l,r);
		else colo_(1,l,r);
	}
	printf("%d\n",a[1].s);
}
int main(){
	solv();
	return 0;
}
/***********************************/
#include<bits/stdc++.h>
using namespace std;
inline int get(){register int re=0,f=1;register char c;while(c=getchar(),(c>='0'&&c<='9')^1)f=c^'-';while(re=(re<<1)+(re<<3)+(c^48),c=getchar(),(c>='0'&&c<='9'));return f?re:-re;}
const int N = 1e5+10;
#define FOR(i,L,R) for(register int i=(L);i<=(R);++i)
#define REP(j,R,L) for(register int j=(R);j>=(L);--j)
struct Seg{
	int n,m,rt,cnt;
	int ls[N],rs[N],col[N],sum[N];//维护信息
	#define ls ls[v]
	#define rs rs[v]
	inline void pushup(int v){
		sum[v]=sum[ls]+sum[rs];
	} 
	inline void pushdn(int v,int L,int r){//下传信息
		if(!ls)ls=++cnt;//注意用动态开点的话标记也要开点 
		if(!rs)rs=++cnt;
		if(col[v]==1){
			int mid=L+r>>1;
			col[ls]=col[rs]=1;
			sum[ls]=mid-L+1;
			sum[rs]=r-mid;
			col[v]=0;
//			cout<<L<<" "<<mid<<' '<<r<<" "<<mid-L+1<<" "<<sum[ls]<<"\n";
		}else if(col[v]==-1){
			col[ls]=col[rs]=-1;
			sum[ls]=0;
			sum[rs]=0;
			col[v]=0;
		}
	}
	inline void insert(int &v,int L,int r,int a,int b,bool opt){
		if(L>b||r<a)return ;
		if(!v)v=++cnt;//新建结点
//		cout<<v<<"\n";
		if(a<=L&&r<=b){//完全包含 
			if(opt)sum[v]=r-L+1,col[v]=1;
			else sum[v]=0,col[v]=-1;
			return ;
		}pushdn(v,L,r);
		int mid=L+r>>1;
		insert(ls,L,mid,a,b,opt),insert(rs,mid+1,r,a,b,opt);
		pushup(v);
//		cout<<ls<<" "<<rs<<" "<<"\n";
	}
	inline void solv(){
		n=get(),m=get();
		FOR(i,1,m){
			int opt=get(),a=get(),b=get()-1;
			insert(rt,1,n,a,b,bool(2-opt));//0删除,1添加 
//			cout<<"\n";
		}cout<<sum[rt]<<"\n";
	}
}t;
int main(){
	t.solv();
	return 0;
}

整体大同小异,主要说一下pushdown操作:

对于一个被完整包含的区间,每次修改的时候设置标记,我们并不将左右儿子也一起修改,而是直接返回,因为其实我们做了不必要的操作,也许根本不会用到我的后代,只有在需要使用后代的时候,我们才将信息传递下去。

 

原理就是对于一个区间[a,b],下面的所有结点[c,d],都有[c,d]属于[a,b],因此[a,b]状态的改变也就代表了[c,d]状态的改变。

看不懂也没关系啦,反正我也是co标之后隔了很长一段时间才理解的。

 

3)扫描线(USACO3.1.4):

Description

N 个不同的颜色的不透明的长方形 ( 1 <= N <= 100 ) 被放置在一张宽为:A、长为:B 的白纸上。这些长方形被放置时,保证了它们的边于白纸的边缘平行。所有的长方形都放置在白纸内,所以我们会看到不同形状的各种颜色。坐标系统的原点 ( 0,0 ) 设在这张白纸的左下角,而坐标轴则平行于边缘。

Input

  按顺序输入放置长方形的方法。第一行输入的是那个放在底的长方形(即白纸)。
  第 1 行: A ,B 和 N,其中 A 和 B 表示白纸宽和长(1 <=A, B<=10,000),N 表示有 N 张不同颜色的不透明长方形; 
  接下来 N 行: 每行有五个整数:lx, ly, rx, ry, color,表示一个颜色不透明长方形放置在白纸上的左下角坐标,右上角坐标和颜色。其中颜色 1 和底部白纸的颜色相同。颜色 1和底部白纸的颜色相同。 (1 <= color<= 2500)

Output

  包含一个所有能被看到颜色连同该颜色的总面积的清单( 即使颜色的区域不是连续的),按color的增序顺序。 
  不要显示没有区域的颜色。

Sample Input

20 20 3

2 2 18 18 2

0 8 19 19 3

8 0 10 19 4

Sample Output

1 91

2 84

3 187

4 38

什么叫做扫描线呢?想象一根很长的平行y轴的线(x轴也可,看个人习惯),我们将这条线从左往右扫描,遇到一个“障碍”便停下计算更新答案。

#include<bits/stdc++.h>
using namespace std;
inline int get(){register int re=0,f=1;register char c;while(c=getchar(),(c>='0'&&c<='9')^1)f=c^'-';while(re=(re<<1)+(re<<3)+(c^48),c=getchar(),(c>='0'&&c<='9'));return f?re:-re;}
const int N = 1e5+10;
#define FOR(i,L,R) for(register int i=(L);i<=(R);++i)
#define REP(j,R,L) for(register int j=(R);j>=(L);--j)
struct doc{
    int xa,ya,xb,yb,c;
}a[N];
struct Tree{
    int L,r,col;
};
int xl[N],qx[N];//离散化
int ans[N];//记录答案
struct segment{
    Tree t[N];
    int n;
    inline void Find(int v,int i){
        if(!t[v].col)return;//子树及自身均未涂色
        if(t[v].col>0){
            ans[t[v].col]+=(t[v].r-t[v].L+1)*(qx[i+1]-qx[i]);
            t[v].col=0;
            return;
        }
        Find(v<<1,i),Find(v<<1|1,i);
        t[v].col=0;//注意此处应该为0,为下一个区间作准备
    }
    inline void insert(int v,int idx){
        if(a[idx].ya>t[v].r||a[idx].yb<t[v].L)return;//不相交
        if(t[v].col>0)return;//已经涂色,则返回
        if(a[idx].ya<=t[v].L&&t[v].r<=a[idx].yb&&t[v].col!=-1)return t[v].col=a[idx].c,void();//完全覆盖且子树中没有涂色结点
        insert(v<<1,idx),insert(v<<1|1,idx);
        t[v].col=-1;//-1表示它的子树中已经有涂色的
    }
    inline void build(int v,int L,int r){
        t[v]=(Tree){L,r,0};
        if(L==r)return ;
        int Mid=L+r>>1;
        build(v<<1,L,Mid),build(v<<1|1,Mid+1,r);
    }
    inline void init(int _n){
        build(1,0,n=_n);
    }
}tr;
struct Seg{
    int X,Y,n;
    //doc a[N];存储矩形记录
    inline void print(){
        ans[1]=X*Y;
        FOR(i,2,2500)ans[1]-=ans[i];
        FOR(i,1,2500)if(ans[i])printf("%d %d\n",i,ans[i]);
    }
    inline void solv(){
        tr.init(Y);//初始化
        FOR(i,1,qx[0]-1){
            REP(j,n,1)if(a[j].xa<=qx[i]&&a[j].xb>qx[i])tr.insert(1,j);
            tr.Find(1,i);
        }
        print();
    }
    inline void init(){
        X=get(),Y=get(),n=get();
        FOR(i,1,n){
            int xa=get(),ya=get(),xb=get(),yb=get()-1,col=get();
            a[i]=(doc){xa,ya,xb,yb,col};//注意线段树按点权建
            xl[xa]=xl[xb]=1;
        }FOR(i,0,X)if(xl[i])qx[++qx[0]]=i;
    }
}z;
int main(){
    z.init();
    z.solv();
    return 0;
}

持续更新ing~

 

C++ 线段树 线段树基本常识 线段树是一种二叉搜索树(即每个节点最多有两颗子树),与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 如下图,就是一颗 [1,10] 的线段树的分解过程: 由图可得出一个结论,线段树的最大深度不超过,且每一颗线段树需要 4*n 的辅助空间,如果没有开到 4*n ,那就完美 RE 了!!! 线段树的的存储 线段树采用的是堆式储存法,即编号为 k 的节点的做儿子为 k... 阅读详情

相关推荐

线段树详解(包含加法线段树、乘法线段树及区间根号线段树,简单易懂)

线段树及简单应用。

qi_programmer的博客 2582

【学习笔记】详解线段树(浅显易懂,匠心之作,图文并茂)

超详解线段树(浅显易懂,几乎涵盖所有线段树类型讲解,匠心之作,图文并茂)

weq2011的博客 3万+

线段树合并与线段树分裂

线段树合并是指建立一棵新的线段树,这棵线段树的每个节点都是两棵原线段树对应节点合并后的结果。线段树分裂实质上是线段树合并的逆过程。线段树分裂只适用于有序的序列,无序的序列是没有意义的,常用在动态开点的权值线段树。线段树分裂与线段树合并密不可分,一般来说没有只分裂不合并的题。的救灾粮,问所有操作结束后每个节点类型最多的救灾粮是那种。一棵树,点有点权,问每个节点的子树内有多少节点点权比它大。从这棵树的根节点开始递归分裂,当节点不存在时,递归结束。显然,对于两颗满的线段树,合并操作的复杂度是。

conti123的博客 934

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

线段树(Segment Tree):一种基于分治思想的二叉树,用于在区间上进行信息统计。它的每一个节点都对应一个区间leftright通常是整数。每一个叶子节点表示了一个单位区间(长度为1),叶子节点对应区间上。每一个非叶子节点的左子节点表示的区间都为,右子节点表示的的区间都为。线段树是一棵平衡二叉树,树上的每个节点维护一个区间。根节点维护的是整个区间,每个节点维护的是父亲节点的区间二等分之后的其中一个子区间。当有n。

白话机器学习 5171

二维线段树(线段树套线段树)

由于网上的其它博客对初学者非常不友好,所以我就来写一篇博客帮助萌新们快速入门树套树啦。所谓线段树套线段树就是在第一棵线段树的每一个结点上再开一颗线段树,第一棵线段树用来维护第一维的数据,再用第一棵线段树上新开的线段树来维护第二维的数据。是不是没听懂呢,下面我们直接上图: 这就是树套树大概的模样,横线上面是第一棵线段树,下面是对第一棵线段树的每一个结点新开的线段树,就像是每一个点内都套着一棵线段树一样,那么二维线段树就可以用来维护平面信息下面看一道例题: 陌上花开 首先对第一维进行排序,然后用树套树进行处理

NEUQ_snowy的博客 4432

硬件级Dalvik字节码粒度无痕HOOK及VMP取址码定位分析

2.通过硬件读写断点的输出信息 可知pc寄存器就是art解释器的取码地址 直接硬件执行断点在这个pc 即可直接trace所有的smali执行流 通杀所有机型系统。本文即将探讨的是 如何在硬件级别实现dalvik bytecode粒度的无痕拦截技术 并实现鼠标点击一键hook 指哪儿打哪儿 感受 button power 的强大魅力!4.由于硬件断点是同步的 断下后可随时硬件dump下这一瞬间的app内存映像 写入unicorn的内存模拟执行。解释器在解释执行前必会读取内存中的bytecode。

2503_90751789的博客 1085

数据结构之线段树

文章目录线段树(区间树)Segment Tree线段树的概念为什么要使用线段树手写一个线段树线段树中的区间查询线段树问题 LeetCode303LeetCode307对区间进行操作的时间复杂度 线段树(区间树)Segment Tree 线段树的概念 线段树是一种特殊的树结构。这种数据结构主要用于解决“线段”或者是“区间”这种特殊的数据 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些...

qq_24095055的博客 1228

ArcGIS数据处理必备技能:从地理坐标到UTM投影的面转栅格完整流程

本文详细介绍了在ArcGIS中从地理坐标到UTM投影的面转栅格完整流程,包括坐标系转换、像元大小设置及质量控制等关键步骤。通过实战案例和Python脚本示例,帮助用户解决常见问题并优化数据处理效率,特别适合需要精确GIS数据分析的专业人士。

weixin_42628688的博客 180

线段树(从入门到进阶)

首先,讲解线段树之前,应该了解到线段树应该是一种工具,可以将一些对于区间(或者线段)的修改、维护,从O(N)的时间复杂度变成O(logN)。 一.线段树概念引入 线段树是一种二叉树,也就是对于一个线段,我们会用一个二叉树来表示。比如说一个长度为5的线段,我们可以表示成这样: 这代表着如果你要表示线段的和,那么最上面的根节点权值就等于两个儿子节点的权值之和。 那么就可以得到:节点i的权值 = i节点的左儿子权值 + i节点的右儿子权值 二.简单线段树 三.区间+/-修改与区间查询 四.区间乘除修改与查询

hahahahahaha5的博客 2972

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader远程升级(含完整代码解析)

本文详细介绍了基于STM32F103VET6与W25Q64外部Flash的Bootloader远程升级实现方案,包含硬件选型、存储分区策略、双校验机制及完整代码解析。通过SPI接口实现固件存储与升级,适用于物联网设备开发,提升OTA功能可靠性。

weixin_42620340的博客 357

opencv去除印章痕迹

今天看到一个很有意思的程序,就是去除票据上的红色印章,觉得很有意思,就把它抄过来记录一下,同时自己也开了一下脑洞。 原来的程序来自:https://www.cnblogs.com/skyfsm/p/7638301.html 可以看到图像效果很不错,下面是源码实现: #include &lt;iostream&gt; #include &lt;opencv2/imgproc/imgpro...

zeng_haoyu的博客 7957

【算法】线段树

几乎是算法竞赛最常用的数据结构了,它主要用于(要求满足结合律)。与树状数组相比,它可以实现的,还可以同时(加、乘),更具通用性。如题,已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x2.求出某区间每一个数的和第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

weixin_73366312的博客 1808

【线段树】线段树入门之入门

线段树的入门级 总结       线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。       对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。       使用线段树可以

生命有一种绝对 4万+

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

PCB模块化设计24——DCDC电源模块PCB布局布线设计规范

qq_31444421的博客 2万+

高熵合金AlCoCrFeNi/金刚石摩擦案例代码

本文介绍金刚石与高熵合金AlCoCrFeNi摩擦的案例。 在之前的文章中,介绍过使用fix indent命令实现虚拟球的摩擦,本文介绍使用金刚石实体球实现高熵合金摩擦的方法。 主要的模拟过程如下: (1)基体建模 建使用原子替换法获得高熵合金初始模型,升温到3000K驰豫后,冷却至300K,获得平衡组织。 (2)摩擦球建模 在高熵合金平衡组织的模型中添加金刚石摩擦球,使用change_box命令扩大box尺寸,添加金刚石摩擦球,并设置混合力场。 (3)摩擦过程 摩擦球下压一定深度后,沿y方向进行摩擦,摩擦

lammps_jiayou的博客 2899

线段树详解

1. 什么是线段树 顾名思义 , 线段树是一棵二叉树 , 但不同的是这棵树的结点储存的值是一个数列中 [l,r][l,r][l,r] 的某个需要的值 (例如,求和,求最大值,求最小值) 这是一棵典型的线段树 ,其性质是 : 若其中一子节点编号为 aaa , 则该节点左儿子编号为 2a2a2a , 其右儿子编号为 2a+12a+12a+1 2. 线段树的用处 线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log2n)O(log_2 n)O(log2​n). 3.

orz 1万+

YOLOv11【第六章:模型压缩与极致优化篇·第15节】YOLOv11 专用剪枝工具库使用指南!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1312

【线段树模板以及Codeforces线段树专题总结】

线段树模板 //线段树一般用来解决可合并的区间问题 //树上维护子树区间的问题也可以通过dfs序+线段树去维护 //不要忘记build,dfs序问题build时注意下标 //数组记得开4倍,push_down一定要想好顺序 //对于每个问题,我们只要考虑清楚push_down和push_up的写法即可 //当问题不好处理的时候,想象一下对于单次询问暴力的做法,再进行区间操作 struct T { ...

lajiyuan的博客 4090

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

线段树及线段树模板

线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为Olog⁡NO(\log N)OlogN。而未优化的空间复杂度为2N2N2N,实际应用时一般还要开空间为4N4N4N的数组以免越界,因此有时需要离散化让空间压缩。线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。

AllenAC的博客 1234

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

有关线段树合并

目录:一:线段树合并概念二:线段树合并应用。

2509_93020071的博客 2195

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

线段树合并

文章目录前置芝士线段树合并概念merge题目描述输入格式输出格式代码 前置芝士 权值线段树 动态开点线段树 线段树合并的全称为动态开点权值线段树合并 加个链接 线段树合并 概念 顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息。 merge 线段树合并所完成的操作就是:在相同区间内,对应位置相加。 合并方式主要如下:两个相同区间的节点 p{p}p 和 q{q}q,合并区间 [l,r]{[l,r]}[l,r]。 若 p{p}p 和 q{q}q 有一者为 0{0}0,则另一者为根。 若 l=

Cauchy的博客 4223

线段树之zkw

线段树之zkw,主要的作用是用来卡常,虽然平时的使用似乎不太多,但是可以学习一下。

月巴虫丰博客 2989

详细图文——线段树

线段树的基本认识和代码。如果您是为了竞赛,那么此文章一定不适合您;如果您只是好奇,或者想了解一下,点进来吧!!^_^通过此文您能了解什么是线段树,线段树的使用场景和自己实现线段树。

带翅膀的猫的博客 3748
上一篇: 网络流入门番外篇
下一篇: 后缀自动机
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值