點的樹上差分
若經過 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,...