HYSBZ 2959 長跑 動態樹 並查集

2021-08-08 01:38:06 字數 2554 閱讀 1933

某校開展了同學們喜聞樂見的陽光長跑活動。為了能「為祖國健康工作五十年」,同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長跑運動。一時間操場上熙熙攘攘,摩肩接踵,盛況空前。

為了讓同學們更好地監督自己,學校推行了刷卡機制。

學校中有n個地點,用1到n的整數表示,每個地點設有若干個刷卡機。

有以下三類事件:

1、修建了一條連線a地點和b地點的跑道。

2、a點的刷卡機台數變為了b。

3、進行了一次長跑。問乙個同學從a出發,最後到達b最多可以刷卡多少次。具體的要求如下:

當同學到達乙個地點時,他可以在這裡的每一台刷卡機上都刷卡。但每台刷卡機只能刷卡一次,即使多次到達同一地點也不能多次刷卡。

為了安全起見,每條跑道都需要設定乙個方向,這條跑道只能按照這個方向單向通行。最多的刷卡次數即為在任意設定跑道方向,按照任意路徑從a地點到b地點能刷卡的最多次數。

input

輸入的第一行包含兩個正整數n,m,表示地點的個數和操作的個數。

第二行包含n個非負整數,其中第i個數為第個地點最開始刷卡機的台數。

接下來有m行,每行包含三個非負整數p,a,b,p為事件型別,a,b為事件的兩個引數。

最初所有地點之間都沒有跑道。

每行相鄰的兩個數之間均用乙個空格隔開。表示地點編號的數均在1到n之間,每個地點的刷卡機台數始終不超過10000,p=1,2,3。

output

輸出的行數等於第3類事件的個數,每行表示乙個第3類事件。如果該情況下存在一種設定跑道方向的方案和路徑的方案,可以到達,則輸出最多可以刷卡的次數。如果a不能到達b,則輸出-1。

sample input

9 31

10 20 30 40 50 60 70 80 90

3 1 2

1 1 3

1 1 2

1 8 9

1 2 4

1 2 5

1 4 6

1 4 7

3 1 8

3 8 8

1 8 9

3 8 8

3 7 5

3 7 3

1 4 1

3 7 5

3 7 3

1 5 7

3 6 5

3 3 6

1 2 4

1 5 5

3 3 6

2 8 180

3 8 8

2 9 190

3 9 9

2 5 150

3 3 6

2 1 210

3 3 6

sample output

-1

-180

170180

170190

170250

280280

270370

380580

hint

資料規模及約定

對於100%的資料,m<=5n,任意時刻,每個地點的刷卡機台數不超過10000。n<=1.5×105

分析:只有加邊沒有刪邊操作,我們考慮把每次把新形成的邊雙縮成乙個點,這樣每次詢問就相當於查詢當前縮點後樹上的權值和了,每次縮點用並查集暴力合併就好。

#include #define inf 2147483640

#define eps 1e-9

const int maxn = 1e6 + 5;

using namespace std;

int n,m,q,f[maxn],f2[maxn],s[maxn],ch[maxn][2],val[maxn],sum[maxn],fa[maxn];

bool lazy[maxn];

inline int nextchr()

inline int read()

inline int find(int x)

inline int find2(int x)

inline bool isroot(int x)

void push_up(int x)

void rotate(int x)

fa[y] = x,fa[x] = z;fa[ch[x][d^1]] = y;

ch[y][d] = ch[x][d^1],ch[x][d^1] = y;

push_up(y),push_up(x);

}inline void push_down(int x)

void splay(int x)

rotate(x); }}

void access(int x)

}void makeroot(int x)

void link(int x,int y)

bool linked(int x,int y)

void rebuild(int x,int y)

int main()

for(int i = 1;i <= 2*n;i++) f[i] = f2[i] = i;

for(int i = 1;i <= m;i++)

}if(p == 2)

if(p == 3)

}}}

bzoj2959 動態樹 長跑

2959 長跑 time limit 10 sec memory limit 256 mb submit 807 solved 408 submit status discuss description 某校開展了同學們喜聞樂見的陽光長跑活動。為了能 為祖國健康工作五十年 同學們紛紛離開寢室,離開教...

bzoj 2959 長跑(LCT 並查集)

time limit 10 sec memory limit 256 mb submit 315 solved 178 submit status discuss 某校開展了同學們喜聞樂見的陽光長跑活動。為了能 為祖國健康工作五十年 同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長...

BZOJ2959 長跑(lct 並查集)

傳送門 用lct維護一顆動態樹。如果連了某一條邊形成了乙個環,證明一次長跑這個環上的所有的點都可以被統計,所以可以將這個環縮成乙個點。用ufs來實現。那麼一次長跑實際上就是在一條樹鏈上跑,只有乙個方向,在lct上維護乙個sum就可以了。時間複雜度是均攤的,因為每乙個點至多被縮點一次,所以o k ml...