2021牛客寒假第六場 動態最小生成樹(線段樹)

2021-10-20 12:16:07 字數 2740 閱讀 4576

題目大意:

有一張 n

nn 個點, m

mm 條邊的圖,每條邊連線點 ui,

vi

u_i,v_i

ui​,vi

​ ,邊權為 w

iw_i

wi​ ,現要進行 q

qq 次如下兩種操作種的一種:

修改第 x

xx 條邊為連線點 y,z

y,zy,

z ,邊權為 ttt;

查詢只用 [l,

r]

[l,r]

[l,r

] 範圍內的邊,得到的最小生成樹的權值為多少,如果無解輸出 imp

ossi

bile

impossibile

imposs

ibil

e ,有解輸出最小生成樹權值和

題目分析:

觀察此題的資料範圍 n

≤200,m

≤30000,q

≤30000

n\le 200,m\le30000,q\le30000

n≤200,

m≤30

000,

q≤30

000 ,發現這張圖的點數很小,可以從此處入手

因為是帶修的區間查詢問題,所以容易想到可以用線段樹來維護資訊

我們開一顆線段樹,每個節點維護當前節點覆蓋的區間範圍內的最小生成樹由哪些邊構成,將這些邊的編號存下來,因為 n

≤200

n\le200

n≤20

0 所以每個節點開乙個小陣列存編號即可

接下來便考慮如何維護線段樹的區間合併:

當我們要合併兩個區間時,可以使用類似於歸併排序合併區間的方法,用兩個指標掃左右兒子維護的那些邊,每次從左右區間選乙個小的邊加進來,進而保證了當前節點加邊是按照邊權遞增的單調性加邊,合併的時間複雜度為 o(n

)o(n)

o(n)

總時間複雜度為 o(q

nlog

m)

o(qnlogm)

o(qnlo

gm)

具體細節見**:

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x3f3f3f3f

#define inf 0x3f3f3f3f3f3f3f3f

//#define int ll

using

namespace std;

intread()

while

(ch>=

'0'&& ch<=

'9')

return res*flag;

}const

int maxn =

205;

const

int maxm =

3e4+5;

const

int mod =3;

const

double pi =

acos(-

1);const

double eps =

1e-8

;int n,m,q,fa[maxn]

,tmp[maxn]

,ans[maxn]

;int

find

(int u)

struct edgeedge[maxm]

;struct sgta[maxm<<2]

;void

pushup

(int root)

q++;}

else

p++;}

}}void

solve

(int root)

q++;}

else

p++;}

}for

(int i =

1;i <= n;i++

) ans[i]

= tmp[i];}

void

build

(int root,

int l,

int r)

int mid = l+r>>1;

build

(root<<

1,l,mid)

;build

(root<<1|

1,mid+

1,r)

;pushup

(root);}

void

updat

(int root,

int l,

int r,

int pos)

void

query

(int root,

int l,

int r,

int ql,

int qr)

int mid = l+r>>1;

if(ql <= mid)

query

(root<<

1,l,mid,ql,qr);if

(qr > mid)

query

(root<<1|

1,mid+

1,r,ql,qr);}

signed

main()

else}}

return0;

}

牛客寒假第六場 刪除子串行

給出乙個長度為nnn的字串sss和乙個長度為mmm的不含重複字元的字串ttt,每次你可以在sss中刪除乙個等於ttt的子串行,最多可以刪除多少次?如字串s ababccds ababccds ababccd,t abct abct abc,可以選擇s1s2s5,s1s2s6,s1s4s5,s1s4s...

2023年牛客寒假集訓營第六場題解

a 回文括號序列計數 思路 只有 形式的才符合題意,但 不是回文串 所以只有0的時候才行,其他都不行 include using namespace std intmain return0 c 末三位 思路 易得 include using namespace std intmain return0...

牛客多校第六場

d 題意感覺說的不是很清楚,一開始題意弄錯了,以為是最優的方案,結果是對於每個盒子這個 so clever 的人的做法是優先選擇盡可能大的物品裝完乙個盒子,我就不知道這個人 聰明了。思路 賽後知道題意後,5分鐘寫完,瞎暴力就一發過了,我自己都有點出乎意料真水了。includeusing namesp...