樹鏈剖分基本原理

2021-09-12 11:13:19 字數 2315 閱讀 3725

樹鏈剖分本質上就是將一棵樹拆分為多條樹鏈,並按照一定的規則進行有規律的儲存,簡化我們樹上的操作。

幾個定義:

size(k) : 以k為根節點時,k的子樹的節點個數。

重兒子:u的子節點中size()最大的點

輕兒子:除了重兒子,剩餘的節點都為輕兒子

重邊:若根節點為u,u的重兒子為v,則(u,v)為重邊

輕邊:除了重邊,剩餘的邊都為輕邊

重鏈:鏈上的所有邊都為重邊

需要計算的值:

fa[u]:u的父親

dep[u]:u節點的深度

size[u]:以u為根節點的子樹的節點數

son[u]:u的重兒子

top[u]:u所在的重鏈的頂點

tid[u]:剖分後節點的新id

rk[u]:新節點id對應在原樹中的節點

dfs1 : 計算size,dep,fa,son陣列

void dfs1(int now, int from, int deep)   // 尋找重邊}}

}

void dfs2(int now, int tp)  // 重邊鏈結成重鏈

}

得到了以上的結果之後,對於樹上路徑的操作就變得很容易了,其實樹上路徑修改就是不斷找lca的過程,如果兩點的top相等說明兩點在同一條重鏈上,直接更新區間 【min(tid[y], tid[x]),max(tid[y], tid[x])】 , 如果不在同一條重鏈上,那麼他們的lca一定不會出現在top較大的重鏈上,那麼不斷更新【tid[top[now]] ,tid[now]】,之到當前兩點的top相等

void change(int x, int y, int val)

if(dep[x] < dep[y]) swap(x,y);

update(tid[y], tid[x], val, 1, n, 1);

}

以hdu3966【書上路徑整體更新 + 單點查詢】為例

#include #define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

using namespace std;

const int maxn = 100000+10;

int num[maxn];

int n , m , q;

//樹鏈剖分

int siz[maxn], top[maxn], son[maxn];

int dep[maxn], fa[maxn], tid[maxn], seg_pos[maxn];

int tim;

vectores[maxn];

void init()

tim = 0;

memset(son, -1, sizeof(son));

}void dfs1(int now, int from, int deep) // 尋找重邊

}}}

void dfs2(int now, int tp) // 重邊鏈結成重鏈}

//線段樹

int sum[4*maxn],col[4*maxn];

void pushup(int rt)

void pushdown(int rt,int m)}

void build(int l,int r,int rt)

int mid=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);}

void update(int l,int r,int v,int l,int r,int rt)

pushdown(rt,r-l+1);

int mid=(l+r)>>1;

if(l<=mid)

update(l,r,v,lson);

if(r>mid)

update(l,r,v,rson);

pushup(rt);}

int query(int l,int r,int rt,int val)

void change(int x, int y, int val)

if(dep[x] < dep[y]) swap(x,y);

update(tid[y], tid[x], val, 1, n, 1);

}int main()

dfs1(1,0,0);

dfs2(1,1);

build(1,n,1);

while(q--)

else}}

return 0;

}

證書鏈的基本原理

pki public key infrastructure 規範體系,包含 問題 數字簽名技術 基於公鑰密碼技術。ca 數字簽名兩個過程 簽發證書的過程 撰寫證書元資料 使用通用的hash 演算法 如sha 256 對證書元資料計算生成數字摘要使用issuer 的私鑰對該數字摘要進行加密,生成乙個加...

樹鏈剖分原理

樹鏈剖分用一句話概括就是 把一棵樹剖分為若干條鏈,然後利用資料結構 樹狀陣列,sbt,splay,線段樹等等 去維護每一 條鏈,複雜度為o logn 那麼,樹鏈剖分的第一步當然是對樹進行輕重邊的劃分。定義size x 為以x為根的子樹節點個數,令v為u的兒子中size值最大的節點,那麼 u,v 就是...

mysql的基本原理 Mysql 基本原理

mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...