1. 程式人生 > >[BZOJ2002][Hnoi2010]Bounce 彈飛綿羊

[BZOJ2002][Hnoi2010]Bounce 彈飛綿羊

gif desc space elong 不存在 bzoj2002 數據 bounce 初始

2002: [Hnoi2010]Bounce 彈飛綿羊

Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 10814 Solved: 5562
[Submit][Status][Discuss]

Description

某天,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

4
1 2 1 1
3
1 1
2 1 1
1 1

Sample Output

2
3
一看到此題就想到了遞推+分塊,寫完後莫名WA了2次後來才發現修改時能將綿羊彈飛的節點的to數組沒歸0. 後來看題解發現正解是動態樹(LCT)蒟蒻的我並不會寫,這裏貼出分塊代碼 技術分享
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
8 int read() 9 { 10 char ch=getchar();int x=0,f=1; 11 while(!isdigit(ch)){if(ch==-)f=-1; ch=getchar();} 12 while(isdigit(ch)){x=x*10+ch-0;ch=getchar();} 13 return x*f; 14 } 15 int n; 16 int a[200002]; 17 int belong[200002],to[200002],b[200002]; 18 int size; 19 int main() 20 { 21 n=read(); 22 size=sqrt(n); 23 for(int i=1;i<=n;i++) 24 { 25 a[i]=read(); 26 belong[i]=(i-1)/size+1; 27 } 28 for(int i=n;i>=1;i--) 29 { 30 if(i+a[i]>n) b[i]=1; 31 else if(belong[i]==belong[i+a[i]]){b[i]=b[i+a[i]]+1;to[i]=to[i+a[i]];} 32 else{b[i]=1;to[i]=i+a[i];} 33 } 34 int m=read(); 35 while(m--) 36 { 37 int ask=read(); 38 if(ask==1) 39 { 40 int now=read(); 41 now++; 42 int ans=0; 43 while(now) 44 { 45 ans+=b[now]; 46 now=to[now]; 47 } 48 printf("%d\n",ans); 49 } 50 else 51 { 52 int now=read(),c=read(); 53 now++; 54 a[now]=c; 55 int bn=belong[now]; 56 for(int i=now;belong[i]==bn;i--) 57 { 58 if(i+a[i]>n) b[i]=1,to[i]=0; 59 else if(belong[i]==belong[i+a[i]]){b[i]=b[i+a[i]]+1;to[i]=to[i+a[i]];} 60 else{b[i]=1;to[i]=i+a[i];} 61 } 62 } 63 } 64 }
View Code

[BZOJ2002][Hnoi2010]Bounce 彈飛綿羊