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

posted @ 2020-11-02 13:30  tianli3151  阅读(80)  评论(0编辑  收藏  举报