題目: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 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...