簡單題 最小生成樹, 樹鏈剖分, 樹上差分

2022-05-20 02:11:17 字數 2240 閱讀 4174

最小生成樹構建出來, 將沒加入最小生成樹的邊稱為 「虛邊」,

假設有一條 「虛邊」 為 u,v

u,v, 則 u,v

u,v 在樹上的路徑上的邊可能被替換, 稱路徑上的邊被覆蓋 .

同上 .

#include

#define reg register

#define pb push_back

intread()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}const

int maxn =

2e6+5;

int n;

int m;

int num0;

int f[maxn]

;int head[maxn]

;struct edge edge[maxn<<1]

;void

add(

int from,

int to,

int w,

int id)

; head[from]

= num0;

}int

find

(int x)

struct edge e[maxn]

;std::multiset <

int> st;

std::multiset <

int>

::iterator it;

std::vector <

int> b[maxn]

;std::vector a;

bool

cmp_1

(edge a, edge b)

void

krus()

}}}int dep[maxn]

;int ans[maxn]

;int fk[

100005][

21];int mk[

100005][

21];int fa_edge[maxn]

;int size[maxn]

;int max_son[maxn]

;int fa[maxn]

;int max_w[maxn]

;void

dfs_1

(int k,

int fa)

}int dfn_tim;

int mp[maxn]

;int dfn[maxn]

;int top[maxn]

;void

dfs_2

(int k,

int fa)

}void

modify_p

(int x,

int y,

int z)

if(dfn[x]

> dfn[y]

) std::

swap

(x, y)

; b[dfn[x]+1

].pb(z)

, b[dfn[y]+1

].pb(

-z);

}void

dfs_0

(int k,

int fa)

}int

mca(

int a,

int b)

s = std::

max(s, mk[a][0

]); s = std::

max(s, mk[b][0

]);return s;

}int

main()

for(reg int i =

1; i <= n; i ++)if

(st.

empty()

) ans[fa_edge[x]]=

1e9+1;

else ans[fa_edge[x]]=

*st.

begin()

;}for(reg int i =

1; i <= m; i ++

)printf

("%d\n"

, ans[i]-1

);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! edge.w plus 1

return0;

}

簡單題 最小生成樹, 樹鏈剖分, 樹上差分

將最小生成樹構建出來,將沒加入最小生成樹的邊稱為 虛邊 假設有一條 虛邊 為 u,v u,vu,v,則 u,v u,vu,v 在樹上的路徑上的邊可能被替換,稱路徑上的邊被覆蓋 同上 include define reg register define pb push back intread whi...

BZOJ2238 mst(最小生成樹 樹鏈剖分)

樹剖好題。首先按題意做出最小生成樹,如果做不出,那麼所有詢問都是 not connected 同樣,如果刪的是非生成樹上的邊,對答案不會造成影響,直接輸出最小生成樹的權值即可。那麼考慮生成樹上的邊被刪的情況 很明顯,對於乙個環上的所有邊,如果刪掉一條,剩下的點仍然會保持聯通。所以這個環上的所有邊都是...

樹上的簡單操作 樹鏈剖分

某神犇 樹鏈剖分什麼垃圾,能做的lct都能做,不能做的lct也能做 線段樹,都會線段樹了應該知道什麼是樹吧 現在考慮一棵樹,每個節點都有乙個點權,要求給x到y路徑上的點都加上k,這個問題可以用樹上差分很簡單地在o m n 的複雜度內解決。再考慮乙個問題,要求查詢樹上x到y這條路徑上的權值和,也可以先...