好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。
下面放上**:
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[maxn];//起點重點權值
void dfs1(int d,int f,int u)
}void dfs2(int u,int tp)
}
賦值val:節點與父親的邊
for(int i=1;iif(dep[e[i].x]查詢:只要不在一條重鏈上,(深度大的)就向父節點靠
int find(int u,int v)
if(u==v) return ans;
if (dep[u] > dep[v]) swap(u, v);
ans = max(query(1,id[hson[u]], id[v]), ans);
return ans;
}
val就用線段樹平衡樹維護一下就行了,這裡就不附**。 樹鏈剖分講解
題目 aragorn s story 題意 給一棵樹,每個結點都有初始的權值,有m個操作,分兩種 一是從x 結點到y 結點路上所有的結點權值 z或 z,二是問x結點的權值。思路 樹鏈剖分。這是我學樹剖的第一題,建議還沒接觸過的夥伴,第一次學習的時候不要一直糾結理論,直接找一道模板題,然後找一篇ac ...
演算法入門 樹鏈剖分 輕重鏈剖分
目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...
樹鏈剖分 樹剖換根
這是一道模板題。給定一棵 n 個節點的樹,初始時該樹的根為 1 號節點,每個節點有乙個給定的權值。下面依次進行 m 個操作,操作分為如下五種型別 換根 將乙個指定的節點設定為樹的新根。修改路徑權值 給定兩個節點,將這兩個節點間路徑上的所有節點權值 含這兩個節點 增加乙個給定的值。修改子樹權值 給定乙...