HNOI2010 彈飛綿羊

2022-05-12 04:42:13 字數 942 閱讀 4783

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

對於20%的資料n,m<=10000,對於100%的資料n<=200000,m<=100000

經典分塊。本來是有兩種暴力求解的方法,

修改時o(n)求出每個點彈出去的次數,可以o(1)查詢。

查詢時o(n)模擬,計算彈出去的次數,可以o(1)修改。

於是我們需要把複雜度均攤一下,就用到了分塊。在每乙個塊內維護彈出這個塊需要的次數,以及掉到**。

修改的時候也只需要修改這乙個塊裡的點彈出去的次數和彈到的位置。最後的時間複雜度就(n√n)

#include

using

namespace

std;  

#define n 200020

intn,m,t,op,x,y;  

intk[n],pos[n],l[n],r[n],step[n],nxt[n];  

template

<

class

t>  

inline

void

read(t &x)  

inline

intcal(

intx)  

return

tmp;  

}  int

main()  

read(m);  

while

(m--)  

}  return

0;  

}  

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...