找這個樹上 重複經過的最多點 經過幾次
看這名字 就醉了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 樹上差分 ...