可以訪問歷史版本的「公升級版」的資料結構,利用訪問歷史版本的性質,可以做到許多在區間上的操作。
例題:
cqoi2111:區間第k大
給定乙個長度為n的序列,m個詢問,每個詢問的形式為:l,r,k表示在[l,r]間中的第k大元素.如果用線段樹來儲存某個區間的第i大,顯然是很不好實現的。因此,我們換乙個思路,我們將線段樹建在值域上(需要離散化),儲存某個區間存在多少個數。(n<=100000, m<=100000,1<=l<=r<=n, 1<=k<=r-l+1)
每插入乙個新的值,那麼這個值會影響線段樹上的哪些節點?
這樣一來,我們就做到了儲存歷史版本。
具體實現,我們可以再插入新節點時,插入位置以外的半個區間的指標指向上乙個版本,繼續走當前這個區間,直到抵達葉節點為止。
對於這道題,求解的過程很類似於在平衡樹上找第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...