HNOI2010 彈飛綿羊

2022-05-20 16:18:38 字數 760 閱讀 8953

題目大意:

給你乙個長度為$n(n\leq200000)$的正整數數列$k$。數列中按照如下方式進行位置跳轉,若當前所在的位置為$i$,則下一步跳轉到$i+k_i$的位置上。要求進行如下兩種操作:

1.將$k_x$的值修改為$y$;

2.詢問從$k_x$出發,需要幾步跳出整個數列?

思路:分塊,記錄每個位置跳出當前塊所需的步數和跳出塊後所到達的位置。每次修改暴力修改整個塊,複雜度$o(\sqrt n)$。詢問時暴力往後跳,複雜度$o(\sqrt n)$。總時間複雜度$o(n+m\sqrt n)$。

1 #include2 #include3 #include4 inline int

getint()

11const

int n=200000;12

intn,k[n],bel[n],begin[n],end[n],step[n],to[n];

13 inline int query(int

x) 19

return

ret;20}

21 inline void update(const

int &b,const

int &e) else30}

31}32int

main()

40 update(0,n-1

);41

for(register int i=getint();i;i--) else49}

50return0;

51 }

hnoi2010 彈飛綿羊

題目描述很明確,現在的目標是均攤兩個操作的複雜度 現在我們已知有兩種方法 1.每次用o 1 的時間修改k值,用o n 的時間直接模擬回答詢問 2.每次修改了k值後用o n 的時間更新所有答案,o 1 時間回答 均攤這兩種操作,可以這樣做 由於只可以從前往後跳,所以可以把跳躍路徑壓縮,更新時把壓縮的部...

HNOI 2010 彈飛綿羊

要求維護乙個 n 個節點的森林,實現 m個詢問,其中包括 n 200,000m 100,000 動態樹的入門題。只需要實現ac cess 操作以及維護子樹大小si ze即可。其實我做這道題是為了找找寫動態樹的感覺,發現了不少要注意的細節。總結地說,越是基本的函式就越不能打錯,不然就要花好多的時間去查...

HNOI2010彈飛綿羊

話說我是冒著巨大的風險a這道題的 xc說不讓上其他oj 這題其實很簡單,每個點如果他能往後跳,那就只能跳到唯一的乙個,這顯然是跟森林,用lct就好,維護下size。突然變短 include include define fo i,a,b for int i a i b i define lc c x...