Holes(河鼠入洞)

2022-05-16 12:15:30 字數 1660 閱讀 8649

好的,我們先來看題:

有n個洞,每個洞有相應的彈力,能把這個球彈到i+power[i] 位置。當球的位置》n時即視為被彈出

輸入: 第一行兩個正整數n,m,下面n個數代表初始的power[i] 之後m行分別代表m個操作 共有兩種操作: 0 a b 把a位置的彈力改成b 1 a 在a處放乙個球,輸出球被彈出前共被彈了多少次,最後一次落在哪個洞。

輸出:對於每個操作2,輸出兩個題目中要求的值(空格隔開)

1<=n<=100000 1<=m<=100000

輸入樣例#1: 複製

8 5

1 1 1 1 1 2 8 2

1 10 1 3

1 10 3 4

1 2

輸出樣例#1: 複製

8 7

8 57 3

其實這道題和彈飛綿羊區別並不大,同樣也是利用分塊來解決,只不過還要求離開前的最後位置。我們還是簡單的理順一下這道題的思路吧:

思路其實很簡單,我們將整個序列分成若干個塊(塊的大小取決於資料,但是我們一般都會預設為√n),對於每一塊的每乙個點我們只要維護他彈出這個塊還需幾步和彈出之後會到達哪乙個點即可。

關於修改,由於每乙個塊之間都是相互獨立的,所以單點修改只需要維護每乙個塊就可以了,並且由於每乙個點的資料都建立在他後面塊的基礎上,所以我們對於每乙個塊都需要倒著來進行維護。

而對於查詢次數我們只要循著每乙個點的指向,累加每乙個點的sum值,大於n的時候跳出即可

可是如果要查詢位置呢?

這裡就隱藏著乙個巨大的坑點:由於每乙個點記錄的只是彈出這個方塊所到達的位置,所以求得的最終位置並不是實際的位置,還要再往後找一遍(就在乙個塊內,時間複雜度可以忽略)就完事了!

最後,附上本題**:

1 #include2 #include3 #include4

using

namespace

std;

5struct

pot6

p[100005];9

int size,cnt=1

,n,ac,ans;

10void change(int

ct)11

21//

printf("%d\n",p[j].to);22}

23}24void query(int

y)25

34while(ac+p[ac].k<=n)

3538}39

intmain()

4052 scanf("

%d",&p[i].k);

53 p[i].conti=cnt;54}

55//

if(temp != 0) cnt++;

56//

printf("%d\n",cnt);

57for(int i=cnt;i >= 1;i--)

58change(i);

59for(int i=1;i<=m;i++)60

70else

7175}76

return0;

77 }

《巨流河》書籤

其 一 另一位堂兄齊振武,原在家鄉種地,淳樸本分。一九五零年韓戰爆發,大陸一片 抗美援朝 聲。他參加村民大會時,冬天大家坐在熱炕上,徵兵的幹部請志願參軍者站起來,一面叫人在炕下加火,熱的坐不住的人剛一起身就被鼓掌,歡迎參軍!注 政策總是需要一些人以別出心裁的方式來貫徹,忠肝義膽終究不是老百姓的特質。...

《呼蘭河傳》有感

最近有些繁忙,很難抽出時間寫寫部落格。只好隨手寫寫讀書感悟,放鬆放鬆。這篇讀書感悟比較短小,只是有感而發。這本 講的並不是某個人的故事,而是各種人物的故事。用一句話概括來說,這本書講的是呼蘭河這座小城的故事。書中塑造的各種性格鮮明的人物形象 祖父 胡家的團員媳婦婆婆 有二伯 老廚子 馮歪嘴子等等,有...

C語言 數字河

描述 數字河中的乙個數n 的後繼數是n 加上其每位數字的和。例如,12345的後繼數是12360,因為12345 1 2 3 4 5 12360。如果數字河的第乙個數為k,我們就稱此數字河為river k。例如,river 480 代表序列,river 483 代表序列。當兩個數字河有相同的元素時,...