bzoj2959 動態樹 長跑

2021-08-17 20:22:02 字數 3226 閱讀 8256

2959: 長跑

time limit: 10 sec memory limit: 256 mb

submit: 807 solved: 408

[submit][status][discuss]

description

某校開展了同學們喜聞樂見的陽光長跑活動。為了能「為祖國健康工作五十年」,同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加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-1

hint

資料規模及約定

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

source

中國國家隊清華集訓 2012-2013 第二天

[submit][status][discuss]

和4229有點像,突出表現了lct find_root函式有多慢。必須使用並查集維護連通性才能過。縮下點,多了個求鏈的權值和的操作。

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

inline

int read()

const

int n=200000;

int rev[n],lc[n],rc[n],fa[n],father[n];

int sum[n],val[n],v[n];

inline

int find(int x)

inline

void unit(int x,int y)

}inline

void updata(int x)

inline

void tag_rev(int x)

inline

void tag_down(int x)

}inline

void rotate(int x)

if(lc[y]==x) lc[y]=b,rc[x]=y;

else rc[y]=b,lc[x]=y;

updata(y);

}int sta[n];

inline

bool is_root(int x)

inline

void splay(int x)

while(sta[0]) tag_down(sta[sta[0]--]);

while(!is_root(x))

rotate(x);

}updata(x);

}inline

void access(int q)

}inline

void make_root(int x)

inline

void sc(int x,int y)

inline

void link(int x,int y)

int fake[n];

inline

int find_root(int x)

inline

void add(int x,int y)

fake[find_root(y)]=find_root(x);

link(x,y);

}int n,m,q;

char sr[5];

struct cc

a[n],b[n];

int ans[n];

int main()

if(tp==3)

make_root(x);

access(y);

splay(x);

printf("%d\n",sum[x]);}}

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

if(a[i].z) puts(ans[i]?"yes":"no");

}

BZOJ 2959 長跑 解題報告

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

刷題 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公尺長...