樹鏈剖分模版

2021-07-07 01:29:40 字數 2328 閱讀 9977

題目:spoj375

樹鏈剖分訓練題目

題意:給定一棵n節點的樹,有兩種操作,①修改某一條邊的權值②查詢某一條鏈u-->v的權值最大的邊。

分析:樹鏈剖分入門學習

對樹鏈剖分的初步認識:

①把樹上的邊分為兩類:重邊輕邊。

②任意兩個節點u和v連線的這條鏈上,重鏈和輕邊的數目都不超過logn(n為總的邊數)

很明顯,以某個輕節點為根的子樹的規模不會超過父親節點的規模的一半,否則就不是輕節點了。

1.在鏈u--->v上,輕邊數目不超過logn

瞎證明:

lca=lca(u,v)。

首先證明u-->lca的鏈上,輕邊數目不超過logn。在極端情況下,鏈上的邊全部為輕邊。

由於u--->lca的這條鏈上以每個點為根節點的子樹的大小最多為父親節點的一半,從lca開始往下走,每次節點的數目都會最少減少一半,所以最多減少logn次就會走到底。

同理證明v--->lca的鏈上,輕邊數目不超過logn。

所以,在鏈u--->v上,輕邊數目不超過2*logn.....

2.在鏈u--->v上,重鏈的數目不超過logn

瞎證明:

u--->v這條鏈可以看成一條鏈有兩種顏色(就是重邊和輕邊),重邊為黑,輕邊為白。//白邊把黑邊分成很多段

初始鏈全部為黑色,現在如何將鏈塗色,使得黑邊的數目最多,明顯就是讓白色交錯在裡面,而白色的邊最多logn條,所以黑色的鏈最多也是logn條。

⑤查詢和修改的u-->v這條鏈的時間複雜度為logn*logn

**:

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define lson l,m,rt<<1

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

const int inf = 2147483647;

const int maxn = 10010;

struct node

list[maxn*2];

int head[maxn],cnt;

int top[maxn];//top[v]表示v所在的重鏈的頂端節點

int fa[maxn]; //父親節點

int deep[maxn];//深度

int sz[maxn];//sz[v]表示以v為根的子樹的節點數

int fp[maxn];//和p陣列相反

int son[maxn];//重兒子

int pos;

void init()

void add(int u,int v)

int dfs1(int cur,int dp) //第一遍dfs求出fa,deep,sz,son

} return sz[cur];

}void dfs2(int cur,int sp) //第二遍dfs求出top和p

}//線段樹

int tree[maxn<<4];

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

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

if(pos<=m)

update(pos,v,lson);

else

update(pos,v,rson);

tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);

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

int q(int l,int r)

int find(int u,int v)//查詢u->v邊的最大值

u = fa[f1]; f1 = top[u];

}if(u == v)return tmp;

if(deep[u] > deep[v]) swap(u,v);

return max(tmp,q(p[son[u]],p[v]));

}int e[maxn][3];

int main()

dfs1(1,1);

dfs2(1,1);

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

char op[10];

int u,v;

while(scanf("%s",op) == 1)

}return 0;

}

樹鏈剖分(模版)

樹鏈剖分是解決在樹上進行插點問線,插線問點等一系列樹上的問題 假如現在給你一棵樹,然後沒兩條邊之間有一條權值,有一些操作,1 x y之間的最大權值是多少,2 改變x y之間的權值 應用範圍 在一棵樹上進行路徑的修改 求極值 求和,這樣的樹,從底向上看每個點都只和乙個點相連,即任何兩點間都有唯一的路徑...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

演算法入門 樹鏈剖分 輕重鏈剖分

目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...