刷題 BZOJ 2959 長跑

2022-05-26 22:09:10 字數 2937 閱讀 2811

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

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

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

有以下三類事件:

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

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

進行了一次長跑。問乙個同學從a出發,最後到達b最多可以刷卡多少次。

具體的要求如下:

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

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

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

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

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

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

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

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

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

-1  

-1

80

170

180

170

190

170

250

280

280

270

370

380

580

資料規模及約定

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

lct維護邊雙

我們只要維護好超級點的權值(dfs的時候加上所有所有屬於它的小點的權值),lct就只要維護乙個sum,詢問的時候先拉鍊再查詢就行了

對於修改,我們只要在lct外記錄乙個陣列,要修改了,就把它所屬的超級點先減掉以前的這個點的權值,再加上新的權值,pushup一下,就搞定了

#include#define ll long long

#define db double

#define ld long double

const int maxn=150000+10;

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

#define lc(x) ch[(x)][0]

#define rc(x) ch[(x)][1]

struct lct

inline int find(int x)

inline bool nroot(int x)

inline void reverse(int x)

inline void dfs(int x,int rt)

inline void pushup(int x)

inline void pushdown(int x) }

inline void rotate(int x)

inline void splay(int x)

inline void access(int x)

inline void makeroot(int x)

inline void split(int x,int y)

inline void link(int x,int y) };

lct t;

#undef lc

#undef rc

templateinline void read(t &x)

templateinline void write(t x,char c='\0')

templateinline void chkmin(t &x,t y)

templateinline t min(t x,t y)

inline int found(int x)

inline void add(int u,int v)

t.split(u,v);t.dfs(t.ch[v][0],v);

}int main()

t.init();

while(m--)

if(opt==3)

a=t.find(a),b=t.find(b);

t.split(a,b);

write(t.sum[b],'\n');

} }return 0;

}

bzoj2959 動態樹 長跑

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

BZOJ 2959 長跑 解題報告

某校開展了同學們喜聞樂見的陽光長跑活動。為了能 為祖國健康工作五十年 同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長跑運動。一時間操場上熙熙攘攘,摩肩接踵,盛況空前。為了讓同學們更好地監督自己,學校推行了刷卡機制。學校中有n個地點,用1到n的整數表示,每個地點設有若干個刷卡機。有...

bzoj 2959 長跑(LCT 並查集)

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