NOIP--线段树合并
概述
在信息学竞赛中,合并是一种常见的问题。
线段树合并是一种快捷、简便的合并方式,可以一定程序的代替启发式合并。
本文阐述线段树合并的一系列内容,包括下列几个问题:
-
1、什么时候使用线段树合并?对于这类线段树合并的问题,存储线段树的方式是什么?
-
2、线段树怎么合并?复杂度是多少?
-
3、线段树合并这一种思想可否在其他数据结构类比?
适用情况 & 存储方式
合并的问题,满足总的点数为O(n)O(n)
我们常常会处理到一些与合并有关的问题,常见下面两种题型:
1、给定情景,快速模拟,进行合并
2、离线问题,通过快速合并、快速查询,解决问题
在使用线段树合并解决一系列的合并问题的时候。
要使用链式线段树存储。
int root[N],tot;struct Segment_Tree {
int l,r;
int lc,rc;
Info x;
Segment_Tree(int _l=0,int _r=0) {
l=_l,r=_r;
lc=rc=0;
x=Info();
}
}tr[S];
线段树的合并方法
下面直接用c++代码的形式刻画出线段树合并。
int Merge(int x1,int x2) {
if (!x1) return x2;
if (!x2) return x1;
int now=Segment_Tree(tr[x1].l,tr[x1].r); tr[now].lc=Merge(tr[x1].lc,tr[x2].lc); tr[now].rc=Merge(tr[x1].rc,tr[x2].rc); tr[now].x=tr[tr[now].lc].x+tr[tr[now].rc].x; return now;
}
线段树合并的方法在其他数据结构上的使用
使用这种方法的前提是:结构相同
最常见的,可以在Trie上使用,特别是处理位运算的那种Trie。如果变化到了k叉,应该也是可以的。
NOIP信息学视频地址
视频地址
链接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw
提取码:7jgr