樹鏈剖分 語文

2021-08-28 12:14:19 字數 1130 閱讀 8394

那個很神奇的詩歌鑑賞樹上每乙個知識點都有乙個重要度,但是捏,新課標那個不和諧的東西決定改變語文考試的側重點。 

新課標一共有q次操作,分別為以下兩種: 

1. 將以知識點i為根的子樹除i之外的點的重要度增加delta 

2. 詢問當前點重要度。 

第一行,知識點數n,運算元q. 

第二行,第乙個知識點的重要度(這個知識點是根) 

以後n-1行,每行2個數,分別為該知識點的重要度和該知識點的父親 

以後m行,為乙個字元和若干個整數,若字元為p,緊接著有兩個整數,整數i和整數delta,表示將以知識點i為根的子樹除i之外的點的重要度增加delta;若字元為u,緊接著為乙個整數x,表示詢問當前點x的重要度。 

對於每個詢問,輸出重要度。

樹鏈剖分的水題,通過size直接實現對子樹的操作,因為只需要區間修改和單點查詢,所以我們使用較為簡單的樹狀陣列

#include#include#include#include#include#include#includeusing namespace std;

int n,m,v[500005],h[500005],cnt,deep[500005],size[500005],top[500005],seg[500005],prt[500005],son[500005],tree[500005];

struct edge

w[500005];

void add(int x,int y)

void dfs(int x)

}void dfs2(int x)

for(int i=h[x];i;i=w[i].next) }

void addsum(int x,int k)

}int sum(int x)

return ans;

}int main()

deep[1]=1;

dfs(1);

seg[0]=seg[1]=top[1]=1;

dfs2(1);

for(int i=1;i<=n;i++) addsum(seg[i],v[i]),addsum(seg[i]+1,-v[i]);

for(int i=1;i<=m;i++)

else

}}

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 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 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...

樹鏈剖分 樹剖換根

這是一道模板題。給定一棵 n 個節點的樹,初始時該樹的根為 1 號節點,每個節點有乙個給定的權值。下面依次進行 m 個操作,操作分為如下五種型別 換根 將乙個指定的節點設定為樹的新根。修改路徑權值 給定兩個節點,將這兩個節點間路徑上的所有節點權值 含這兩個節點 增加乙個給定的值。修改子樹權值 給定乙...