某校開展了同學們喜聞樂見的陽光長跑活動。為了能「為祖國健康工作五十年」,同學們紛紛離開寢室,離開教室,離開實驗室,到操場參加3000公尺長跑運動。一時間操場上熙熙攘攘,摩肩接踵,盛況空前。
為了讓同學們更好地監督自己,學校推行了刷卡機制。
學校中有n個地點,用1到n的整數表示,每個地點設有若干個刷卡機。
有以下三類事件:
1、修建了一條連線a地點和b地點的跑道。
2、a點的刷卡機台數變為了b。
3、進行了一次長跑。問乙個同學從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。
思路:用lct維護鏈的資訊,用並查集進行縮點。
注意到每次縮點後只有虛邊連的邊是不對的,所以在access時重新練一下虛邊和詢問的時候詢問並查集的根就可以了,但是bzoj我還是沒卡過去...
code:
#include #include #define ll long long
#define fa par[now]
#define ls ch[now][0]
#define rs ch[now][1]
const int n=150010;
int read()
return x;
}int ch[n][2],par[n],tag[n],s[n],f[n],tot,tmp,n,m;
ll sum[n],dat[n],dat[n];
int find(int x)
int identity(int now)
bool isroot(int now)
void updata(int now)
void reverse(int now)
void connect(int f,int now,int typ)
void pushdown(int now)
}void rotate(int now)
void splay(int now)
void access(int now)
void evert(int now)
int findroot(int now)
void dfs(int now,int anc)
void link(int u,int v)
void query(int u,int v)
int main()
else
query(find(x),find(y));
}return 0;
}
2018.12.11 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公尺長...