資料結構 可持久化線段樹 Trie總結

2021-08-11 04:06:39 字數 2387 閱讀 6487

可以訪問歷史版本的「公升級版」的資料結構,利用訪問歷史版本的性質,可以做到許多在區間上的操作。

例題:

cqoi2111:區間第k大

給定乙個長度為n的序列,m個詢問,每個詢問的形式為:l,r,k表示在[l,r]間中的第k大元素.

(n<=100000, m<=100000,1<=l<=r<=n, 1<=k<=r-l+1)

如果用線段樹來儲存某個區間的第i大,顯然是很不好實現的。因此,我們換乙個思路,我們將線段樹建在值域上(需要離散化),儲存某個區間存在多少個數。

每插入乙個新的值,那麼這個值會影響線段樹上的哪些節點?

這樣一來,我們就做到了儲存歷史版本。

具體實現,我們可以再插入新節點時,插入位置以外的半個區間的指標指向上乙個版本,繼續走當前這個區間,直到抵達葉節點為止。

對於這道題,求解的過程很類似於在平衡樹上找第k大

如果左區間的數的個數》k,走左樹

反之,走右樹,並將 k-左區間的數的個數

附上我的(醜)模板

#include

#include

#include

#include

#define sf scanf

#define pf printf

#define maxn 100010

using namespace std;

struct nodeseg[maxn*20],*root[maxn],*ncnt=seg;

int a[maxn],b[maxn],bn,n,m;

void init(node *p)

void build(node *&p,int l,int r)

void insert(node *&

x,node *&

y,int val,int l,int r)

int pos(int

x)void prepare()

sort(b+1,b+1+n);

bn=unique(b+1,b+1+n)-b;

build(root[0],1,bn);

for(int i=1;i<=n;i++)

insert(root[i],root[i-1],pos(a[i]),1,bn);

}int find(node *x,node *y,int k,int l,int r)

void solve()

}int main()

//cqoi2011

另外一道簡單例題:

spoj-cot

簡單地說,可持久化地過程,就是對於每個點,均插入logn個節點來儲存它所在的歷史版本的資訊。

例題:

hdu4757:tree

實質上和可持久化線段樹是一樣的,

為了儲存歷史版本,我們對於每個點,都插入logn個節點

具體操作與可持久化線段樹也差不多。

求解的時候,用貪心的方式即可。(即)

#include

#include

#include

#include

#include

#define sf scanf

#define pf printf

#define maxn 100010

using

namespace

std;

struct nodeseg[maxn*20];

int ncnt,root[maxn];

int a[maxn],n,m,u,v;

const

int len=18;

int fa[maxn][20],deep[maxn];

vector

r[maxn];

void insert(int &x,int &y,int val,int len1)

void dfs(int x,int f,int dep)

}void prepare()

dfs(1,0,1);

}int find(int x,int y,int xx,int yy,int len1,int val)

return res;

}int lca(int x,int y)

return fa[x][0];

}void solve()

}void init()

int main()

}

可持久化trie樹

腦補出來的乙個東西,不知道別人是怎麼實現的 自己也還沒有用寫的 交過題 不過把想法和大佬說了,應該是正確的。乙個數列,每次查詢 l,r 內的數中取乙個數和給定值xor後的最大值。如果沒有區間限制,那麼直接將所有數都插入trie樹就可以了,但是這裡需要指定區間的,所以不能直接處理。因此對於trie樹上...

Trie樹 可持久化

made by xiper updata time 2015 12 8 test status 使用前呼叫初始化函式 init 同時 root 0 0 struct trie persistent tree triesize 獲取字符集雜湊編號 必須在 0 lettersize 之內 inline ...

資料結構 可持久化權值線段樹

解決靜態區間第k小的問題。include using namespace std const int maxn 2e5 5 int tot,n,m int sum maxn 5 rt maxn ls maxn 5 rs maxn 5 int a maxn ind maxn len inline in...