某天,lostmonkey發明了一種超級彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請小綿羊一起玩個遊戲。遊戲一開始,lostmonkey在地上沿著一條直線擺上n個裝置,每個裝置設定初始彈力係數ki,當綿羊達到第i個裝置時,它會往後彈ki步,達到第i+ki個裝置,若不存在第i+ki個裝置,則綿羊被彈飛。綿羊想知道當它從第i個裝置起步時,被彈幾次後會被彈飛。為了使得遊戲更有趣,lostmonkey可以修改某個彈力裝置的彈力係數,任何時候彈力係數均為正整數。
輸入格式:
第一行包含乙個整數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
輸出格式:
對於每個i=1的情況,你都要輸出乙個需要的步數,佔一行。
輸入樣例#1:
41 2 1 1
31 1
2 1 1
1 1
輸出樣例#1:
2分塊經典例題,把這個長度為n的序列分成√n個,對於每段小區間,我們維護以下這幾個值:3
s[i]---從第i個點跳出該小區間需要的步數(step)
t[i]---跳出該小區間後會到達哪個節點(to)
查詢時每次直接 step+=s[i],i=[i],複雜度不超過√n;
修改時直接賦值後把當前塊暴力重建,複雜度為√n;
總時間複雜度o(m*√n)
總空間複雜度o(n)
#1ac5ms/14937kb
#2ac284ms/14937kb
#3ac5ms/14937kb
#4ac265ms/14937kb
#5ac188ms/14937kb
#6ac274ms/14937kb
#7ac158ms/14937kb
#8ac292ms/14937kb
#9ac441ms/14937kb
#10ac448ms/14937kb
1 #include 2 #include 3 #include 4 #include 5#define ll long long
6using
namespace
std;
7const
int n=200200;8
intk[n],bl[n],t[n],s[n];
9int
blo,n,m,tot;
10int
read()
13while(c<='
9'&&c>='
0')v=v*10+c-'
0',c=getchar();
14return v*f;15}
16void reset(int
x)24}25
}26int query(int
x)32
return
rtn;33}
34void change(int x,int
v)38
intmain() 44
tot=bl[n];
45for(int i=1;i<=tot;i++)reset(i);
46 m=read();
47while(m--)
54if(opt==2)58
}59return0;
60 }
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...