BZOJ 4764 彈飛大爺

2022-04-30 08:12:05 字數 2005 閱讀 8560

time limit: 30 sec  memory limit: 256 mb

submit: 39  solved: 24

[submit][status][discuss]

自從wc退役以來,大爺是越來越懶惰了。為了幫助他活動筋骨,也是受到了彈飛綿羊一題的啟發,機房的小夥伴們

決定齊心合力構造乙個下面這樣的序列。這個序列共有n項,每項都代表了乙個小夥伴的力量值,如果大爺落到了

第i個小夥伴的手裡,那麼第i個小夥伴會把大爺彈到第i+ai個小夥伴手裡,其中ai就是第i個小夥伴的力量值,也

就是序列的第i項。然而,因為大爺太沉了,所以有些小夥伴不能撐到鍛(you)煉(xi)結束,所以我們中途會替

換一些小夥伴,也就是改變序列的某些項。而且,因為大爺太沉了,所以有些小夥伴不能把大爺扔向前方,而是會

把大爺往反方向扔,也就是序列中的一些項會是負的(當然,也可能是零嘍)。現在機智的大爺通過在空中的觀察

,已經知道小夥伴們的所有活動——即初始序列、所有更改操作,他想請你算一算,如果他在某時刻落到了某個位

置,那麼他會在幾次彈起之後落到小夥伴序列之外(畢竟摔在地上還是蠻疼的)。

第一行為兩個整數n和m,代表序列長度和操作次數。

第二行為n個整數,代表初始的小夥伴序列。

接下來有m行,每行代表乙個操作。

如果這一行的第乙個數是1,代表該操作是乙個詢問操作,接下來乙個數x,代表詢問此時大爺從x處,經過幾次彈

起會摔在地上。如果永遠不會摔在地上,請輸出-1。

如果這一行的第乙個數是2,代表該操作是乙個更改操作,接下來兩個數x,y,代表將序列的第x項改為y。

n,m <= 200000  |ai| < n

對於每次詢問操作,輸出彈起次數或-1。

3 19

1 1 1

1 11 2

1 32 1 2

1 11 2

1 32 3 -1

1 11 2

1 32 2 233

1 11 2

1 32 2 -233

1 11 2

1 3321

221-1

-1-131

2312

by yousiki & guozz

這是基環森林,如果乙個聯通塊沒有換那麼就是普通的lct,如果有環那麼大爺就永遠不需要落地輸出-1...

現在我們斷掉環上的任意一條邊(x,y),然後把這條邊變成虛邊,x就作為這個聯通塊的根節點,那麼x的環父親就是y,然後刪邊的時候判斷刪掉之後xy是否聯通,不聯通就把xy這條虛邊連上...

#include#include#include#include//by neighthorn

using namespace std;

const int maxn=200000+5;

int n,m,p[maxn];

struct m

inline void update(void)

inline bool isroot(void)

inline void pushdown(void) }

}tr[maxn];

inline void connect(m *f,m *t,int s)

inline void rotate(m *t)

inline void push(m *t)

inline void splay(m *t) }}

inline void access(m *t)

}inline void makeroot(m *t)

inline void cut(m *t)

inline void link(m *f,m *t)

inline m *find(m *t)

inline void add(m *t,m *f)

inline void change(m *t,m *f) }}

signed main(void)

else

} return 0;

}

by neighthorn

BZOJ4764 彈飛大爺

和彈飛綿羊類似的,那題是維護乙個內向樹,這題是維護若干棵基環內向樹和一棵內向樹 同樣的用lct維護就好了 內向樹可以直接維護,對於基環內向樹,隨便找環上一點x做根,記錄他指向哪個點to x 對於cut操作,不在環上可以直接斷,否則斷了之後要把x和to x 連起來 對於link操作,如果不成環同樣可以...

bzoj4764 彈飛大爺

傳送門 你們搞的這個題目啊,exciting!lct裸題嘛。記得特判一下根節點所連出的邊是否會成環就行了,還有刪邊的時候特判一下是否需要把這條邊加回去。幾天不寫lct,結果一寫就寫出各種腦殘錯誤,我怎麼這麼菜,233 1 include2 include3 include4 define isroo...

BZOJ 4764 彈飛大爺 LCT

思路並不難,主要是細節需要注意一下.在 lct 中,刪邊要寫成 f lson 0,lson 0 因為刪 x y 時 y 不一定是左兒子,y 只是 x 的前驅 然後 f lson lson 0 這個寫法在一些編譯器上是錯誤的 就是你會發現 f lson 中這個 lson 會變成 0 因為那個錯誤 tl...