這道題由於只是在最後詢問,因此我們可以利用一種叫做差分的技巧,具體來說,就是如果要修改u到v的路徑,我們可以將sum[u]++,sum[v]++,sum[lca(u,v)]--,sum[father[lca(u,v)]]--。這樣我們可以通過一遍dfs自底向上轉移sum值,這樣就能最後在o(n)的時間內求出每個點的值。
#include#include#includeusing namespace std;
#define maxn 50005
int pre[maxn*2],other[maxn*2],last[maxn];
int n,m,l,jump[maxn][17],dep[maxn],ans[maxn],sum[maxn];
bool vis[maxn];
void connect(int x,int y)
void pre_dfs(int u)
}void dfs(int u)
}int lca(int u,int v)
return jump[u][0];
}int main()
{ scanf("%d%d",&n,&m);
for (int i=1;i
洛谷P3128USACO最大流 樹上差分入門
一道樹上差分的入手好題,中文題面不再贅述 讀完題後,我們發現,答案就是圖中的點被經過的最多次數,即有多少條路徑經過它,暴力期望得分20 40分,正解是什麼呢?樹上差分 lca 沒錯,和差分的操作一樣,在區間的左端點加一,在右端點 1的位置減一,只不過放到了樹上,我們先預處理每個點的lca,之後我們發...
洛谷P2680 運輸計畫 樹上差分
題目 久違地1a了好高興啊!首先,要最大值最小,很容易想到二分 判斷當前的 mid 是否可行,需要看看有沒有去掉一條邊使滿足的方案 這就需要樹上差分來找出每條邊被幾個超過 mid 的路線覆蓋 若有一條邊正好被所有超過 mid 的路線覆蓋,且去掉它之後最大的路線也能滿足,就是可行的。如下 includ...
LCA,二分,樹上差分 洛谷 2680 運輸計畫
一棵樹,每條邊上都有邊權,現在選擇一條邊將邊權變為0,使 m 條路徑邊權和其中一條的最大值最小,問這個值 由於大於最終結果的一定可行,小於最終結果的一定不可行,所以二分答案,首先答案以下的需求都不需要考慮,差分,如果該位置上的需求數量等於所需求的數量那麼這條邊就可以選,但是如果最大值減去這條邊仍不能...