樹鏈剖分本質上就是將一棵樹拆分為多條樹鏈,並按照一定的規則進行有規律的儲存,簡化我們樹上的操作。
幾個定義:
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...