樹上差分的整理(點的樹上差分和邊的樹上差分)

2021-10-18 03:26:50 字數 2341 閱讀 6339

點的樹上差分

若經過 u 到 v 的所有點,tmp[u]++,tmp[v]++,tmp[lca(u,v)]–,tmp[parent[lca(u,v)][0]]–。

例題:

#include

using

namespace std;

struct ss

;ss data[

600010];

int n,q;

int a[

300010

],head[

600010

],deep[

300010

],p[

300010][

25],sum[

300010];

void

change

(int

&a,int

&b)void

add(

int a,

int b)

void

dfs(

int a,

int fa)

}int

lca(

int a,

int b)

}//printf("%d %d\n",a,b);

if(a==b)

return a;

for(

int i=

20;i>=

0;i--

)//printf("a=%d\n",a);

return p[a][0

];}void

search

(int a)

}int

main()

dfs(1,

0);for

(int i=

1;i<=n-

1;i++

)search(1

);//for(int i=2;i<=n;i++)

//sum[a[i]]--;

for(

int i=

1;i<=n;i++

)printf

("%d\n"

,sum[i]);

return0;

}

邊的樹上差分

若經過 u 到 v 的所有邊,tmp[u]++, tmp[v]++, tmp[lac(u, v)]-=2。

統計某條邊的經過次數只需要統計它的兒子節點的子樹和。

例題:

#include

#define n 300005

using

namespace std;

int a[n]

,b[n]

,l[n]

,to[n*2]

,head[n]

,nextt[n*2]

,valuee[n*2]

,vva[n]

,f[n][22

],he[n]

,dep[n]

,p[n]

,dis[n]

,d[n]

;int m,n;

intread()

while

(s>=

'0'&&s<=

'9')

return x*f;

}int tot;

void

add(

int a,

int b,

int z)

int pp=0;

void

dfs(

int x,

int ff)

}int

lca(

int x,

int y)

int max1=

0,maxx=0;

bool

check

(int mid)

}for

(int i=n;i>=1;

--i)

return

false;}

intgao

(int l,

int r)

return ans;

}int

main()

dis[1]

=0;dfs(1

,1);

for(

int i=

1;i<=m;

++i)

printf

("%d"

,gao

(maxx-max1,maxx+1)

);}/*

6 31 2 1

2 3 4

3 4 6

4 5 2

5 6 7

1 3

2 54 6

*/

字首和 差分與樹上差分

1.1 字首和 字首和可以通過對乙個序列進行o n 的預處理後,在o 1 時間內求出任意乙個子串行的和。1.2 差分 可以用於求解多次區間修改與區間詢問的題型,例如多次次給 l r 內所有數 val,就可以用差分以及字首和來優化。區間操作o 1 區間詢問o n 處理,o 1 查詢。1.3 樹上差分 ...

差分 樹上差分略解

差分 樹上差分略解 哈哈差分?先來看一道題 題目描述 給定包含 n個數的陣列 a1,a2,an.有 k次操作 每次操作把區間 l,r 加上v 最後求出數列每個位置的數。輸入格式 第一行,n.第二行,a1,a2,an下一行,k,下k行,每行乙個操作,格式為l,r,v 輸出格式 一行,更新後的陣列 樣例...

差分總結二 樹上差分

找這個樹上 重複經過的最多點 經過幾次 看這名字 就醉了orz 這題是 樹上差分 模板題 點差分 點差分的話 由於 lca 本身是有貢獻的 那麼d lca 用d lca父親 只要消掉影響 include using namespace std const int maxn 1e5 10 int n,...