BZOJ2002 Bounce 彈飛綿羊 《分塊》

2022-05-16 02:40:39 字數 1245 閱讀 7409

bounce 彈飛綿羊

某天,lostmonkey發明了一種超級彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請小綿羊一起玩個遊戲。遊戲一開始,lostmonkey在地上沿著一條直線擺上n個裝置,每個裝置設定初始彈力係數ki,當綿羊達到第i個裝置時,它會往後彈ki步,達到第i+ki個裝置,若不存在第i+ki個裝置,則綿羊被彈飛。綿羊想知道當它從第i個裝置起步時,被彈幾次後會被彈飛。為了使得遊戲更有趣,lostmonkey可以修改某個彈力裝置的彈力係數,任何時候彈力係數均為正整數。

input

第一行包含乙個整數n,表示地上有n個裝置,裝置的編號從0到n-1,接下來一行有n個正整數,依次為那n個裝置的初始彈力係數。第三行有乙個正整數m,接下來m行每行至少有兩個數i、j,若i=1,你要輸出從j出發被彈幾次後被彈飛,若i=2則還會再輸入乙個正整數k,表示第j個彈力裝置的係數被修改成k。對於20%的資料n,m<=10000,對於100%的資料n<=200000,m<=100000

output

對於每個i=1的情況,你都要輸出乙個需要的步數,佔一行。

sample input

41 2 1 1

31 1

2 1 1

1 1sample output23

標籤:lct,分塊

本題其實應該是lct的基礎題,但是因為我身為蒟蒻寫不來lct,就用分塊做了。

「分塊者,好寫好調還很優」 ——某神犇

把原數列分為sqrt(n)個塊,對於每個塊,維護塊內的每個位置需要多少步才能跳到塊外,以及跳到塊外後的位置,對於修改操作,重算那個塊內的所有位置的兩個值,這樣單次詢問或修改複雜度o(sqrt(n))。可以過。

最後附上ac**:

#include #include #include #define max_n 200000

using namespace std;

int n, m, magic, k[max_n+5];

int pos[max_n+5], times[max_n+5];

void update(int l, int r)

int main()

if (opt == 2)

} return 0;

}

這題寫分塊簡直賺了,這麼短的**還可以a掉此題,lct麻煩得多。

分塊大發好

Bounce 彈飛綿羊

bounce 彈飛綿羊 分塊 將整個大區間分成若干塊,每個點維護到下乙個塊需要跳的次數以及會跳到哪個點 分塊要注意細節,區間開閉容易弄亂 如下 1 include2 include3 include4 include5 define b int sqrt n 6 define n 200000 7u...

bzoj2002 彈飛綿羊

lct裸題 給出一棵樹,有修改及詢問,修改操作為修改乙個節點的父親,詢問乙個節點到根的點數。詢問及修改前只需access一遍即可。include include include include include include define rep i,x,y for int i x i y i de...

BZOJ2002 彈飛綿羊

這題可以用分塊暴力做,這裡給出正解lct的 對於每乙個彈射器i k相當於i的父親,大於n的全部歸到n 1上。這樣對於修改操作就像於換了個父親,我們要記錄下上一次的父親因為在splay中父親可能會改變。對於查詢操作就相當於把n 1mroot到根,因為你新增時會更新,不能確保n 1的位置。而答案就是xs...