樹上差分實際上類似於樹鏈剖分,將一條鏈分為輕鏈和重鏈,再分別對兩個直鏈去做差分標記,最後再去對於每個點dfs他的子節點求樹上字首和.
類似的題目自己做過的不多,這裡推薦兩道比較簡單的題目,都是邊覆蓋問題.
eoj monthly 2018.8 d. delivery service||p2680 運輸計畫
樹上邊差分(邊覆蓋)
struct point_pair
pp[maxn];
inline int dfs(int u,int pre)
tot[++pos]=ans;
return ans;
}int cal(int n,int m)//邊覆蓋最小/最大權
dfs(1,0);
int ans=0;
sort(w+1,w+n);
sort(tot+1,tot+pos,cmp);
for(int i=1;i樹上點差分(點覆蓋)
struct point_pair
pp[maxn];
inline int dfs(int u,int pre)
tot[++pos]=ans;
return ans;
}int cal(int n,int m)//點覆蓋最小/最大權
dfs(1,0);
int ans=0;
sort(w+1,w+n);
sort(tot+1,tot+pos,cmp);
for(int i=1;ireturn ans;
}
樹上最小邊覆蓋問題
1077.皇宮看守 對於一條邊,可以由父節點覆蓋,或者子節點覆蓋,f u 0 表示該節點不放士兵,f u 1 表示該節點放士兵.當該節點不放時,只有由所有子節點放的情況轉移 當該節點放時,可以由子節點放或不放的情況轉移而來 includeusing namespace std const int n...
HDU 1350 最小邊覆蓋
將某個人的行程視為二分圖中的乙個節點,用結構體記錄每個節點的資訊 起點時間,終點時間,位置 然後對於每個節點,看它結束後能否提前趕到其他節點,能的話就加邊。然後就用二分圖匹配,算出最小邊覆蓋就可以了。為什麼是最小邊覆蓋,因為乙個計程車走一條邊,囊括所有節點的最少的邊數就是我們要求的最少計程車數。記得...
BZOJ3631 松鼠的新家 樹上差分 點差分
n n 3e5 個點的一棵樹,給出a1到an,從a1走到a2,再從a2走到a3,從a3走到a4,從an 1走到an 要求,走的路徑上每走乙個點放乙個糖果,最後an不放,問每個點放了多少糖果 裸的樹上點差分,a1走到a2,就把這一條路徑 1即可 由於後續又把a2走到a3的路徑 1,故需要對a2單點減一...