差分總結二 樹上差分

2021-09-27 02:09:01 字數 3152 閱讀 3367

找這個樹上 重複經過的最多點 經過幾次

看這名字 就醉了orz 這題是 樹上差分 模板題 點差分

點差分的話 由於 lca 本身是有貢獻的 那麼d[lca] – 用d[lca父親] – 只要消掉影響

#include

using namespace std;

const

int maxn =

1e5+10;

int n, m;

int head[maxn]

, cnt;

int nxt[maxn <<1]

, to[maxn <<1]

;int ans[maxn]

;void

ade(

int a,

int b)

int depth[maxn]

, fa[maxn][25

];void

dfs(

int x,

int pre)

intlca

(int x,

int y)

int outans;

void

dfsans

(int x,

int pre)

outans =

max(outans, ans[x]);

}signed

main()

dfs(1,

0);for

(int i =

1, a, b; i <= m; i ++

)dfsans(1

,0);

printf

("%d\n"

, outans)

;return0;

}

依然是點差分的題

按照題目給的順序去加 而且 我們要記得減去 除去a1的 其他點 重複經過的的一次 // 這次終點是下一起點

for(int i = 2; i <= n; i ++) ans[id[i]] --; 剛好 最後乙個點 因為是廚房 不要糖 我們也正好給剪掉了

#include

using namespace std;

const

int maxn =

3e5+10;

int n, m;

int head[maxn]

, cnt;

int nxt[maxn <<1]

, to[maxn <<1]

;int ans[maxn]

;void

ade(

int a,

int b)

int depth[maxn]

, fa[maxn][25

];void

dfs(

int x,

int pre)

intlca

(int x,

int y)

int outans;

void

dfsans

(int x,

int pre)

}int id[maxn]

;signed

main()

dfs(1,

0);for

(int i =

1, a, b; i < n; i ++

)dfsans(1

,0);

for(

int i =

2; i <= n; i ++

) ans[id[i]]--

;for

(int i =

1; i <= n; i ++

)printf

("%d\n"

, ans[i]);

return0;

}

想睡了 還有個 邊差分的 + 2個練習題 明天補

這個是邊差分

我們可以把 乙個通道 變成 0 那樣的話 我們二分 找他

如果 大於這個邊的 找大家都可以最長公用邊 然後 最長邊 - 他 > mid 就可以找更長的

#include

using namespace std;

const

int maxn =

3e5+10;

int n, m;

int head[maxn]

, cnt;

int nxt[maxn <<1]

, to[maxn <<1]

, val[maxn <<1]

;void

ade(

int a,

int b,

int c)

int depth[maxn]

, fa[maxn][25

], d[maxn]

, toval[maxn]

;void

dfs_lca

(int x,

int pre)

}int

lca(

int x,

int y)

intredis

(int a,

int b)

struct node

} pa[maxn]

;int num, ret, coun[maxn]

;void

dfs(

int x,

int pre)

if(coun[x]

== num && ret < toval[x]

) ret = toval[x];}

int mlen;

bool chk

(int mid)

dfs(1,

0);//cout << ret << endl;

return mlen - ret <= mid;

}signed

main()

dfs_lca(1

,0);

for(

int i =

1, a, b; i <= m; i ++

) mlen = r;

l = mlen - l, r = mlen +1;

while

(l < r)

printf

("%d\n"

, l)

;return0;

}

差分 樹上差分略解

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

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

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

字首和 差分與樹上差分

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