bzoj 2002
2002: [Hnoi2010]Bounce 彈飛綿羊
Time Limit:?10 Sec??Memory Limit:?259 MBSubmit:?12203??Solved:?6162
[Submit][Status][Discuss]
Description
某天,Lostmonkey發(fā)明了一種超級(jí)彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請(qǐng)小綿羊一起玩?zhèn)€游戲。游戲一開始,Lostmonkey在地上沿著一條直線擺上n個(gè)裝置,每個(gè)裝置設(shè)定初始彈力系數(shù)ki,當(dāng)綿羊達(dá)到第i個(gè)裝置時(shí),它會(huì)往后彈ki步,達(dá)到第i+ki個(gè)裝置,若不存在第i+ki個(gè)裝置,則綿羊被彈飛。綿羊想知道當(dāng)它從第i個(gè)裝置起步時(shí),被彈幾次后會(huì)被彈飛。為了使得游戲更有趣,Lostmonkey可以修改某個(gè)彈力裝置的彈力系數(shù),任何時(shí)候彈力系數(shù)均為正整數(shù)。
Input
第一行包含一個(gè)整數(shù)n,表示地上有n個(gè)裝置,裝置的編號(hào)從0到n-1,接下來一行有n個(gè)正整數(shù),依次為那n個(gè)裝置的初始彈力系數(shù)。第三行有一個(gè)正整數(shù)m,接下來m行每行至少有兩個(gè)數(shù)i、j,若i=1,你要輸出從j出發(fā)被彈幾次后被彈飛,若i=2則還會(huì)再輸入一個(gè)正整數(shù)k,表示第j個(gè)彈力裝置的系數(shù)被修改成k。對(duì)于20%的數(shù)據(jù)n,m<=10000,對(duì)于100%的數(shù)據(jù)n<=200000,m<=100000
Output
對(duì)于每個(gè)i=1的情況,你都要輸出一個(gè)需要的步數(shù),占一行。
Sample Input
41 2 1 1
3
1 1
2 1 1
1 1
Sample Output
23
HINT
Source
代碼:
//維護(hù)每個(gè)點(diǎn)跳出他所在的塊需要的次數(shù)val以及跳到下一個(gè)塊的哪個(gè)點(diǎn)上nex ,更新x點(diǎn)時(shí)更新x點(diǎn)和x點(diǎn)所在的塊的在x前面的點(diǎn)的val和nex ,查詢 //就很簡(jiǎn)單了 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int MAXN=210009; int n,B,cnt,k[MAXN],be[MAXN],val[MAXN],nex[MAXN]; void build() {for(int i=n;i>=1;i--){int j=i+k[i];if(be[i]!=be[j]) { val[i]=1;nex[i]=j; }else { val[i]=val[j]+1;nex[i]=nex[j]; }} } void update(int x,int y) {k[x]=y;for(int i=be[x]*B;i>=(be[x]-1)*B+1;i--){int j=i+k[i];if(j<=be[x]*B) { val[i]=val[j]+1;nex[i]=nex[j]; }else { val[i]=1;nex[i]=j; }} } int query(int x) {int s=0;while(x<=n){s+=val[x];x=nex[x];}return s; } int main() {scanf("%d",&n);B=sqrt(n);cnt=n/B+(n%B!=0);for(int i=1;i<=n;i++){scanf("%d",&k[i]);be[i]=(i-1)/B+1;}build();int q,op,x,y;scanf("%d",&q);while(q--){scanf("%d",&op);if(op==1){scanf("%d",&x);x++;printf("%d\n",query(x));}else{scanf("%d%d",&x,&y);x++;update(x,y);}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/--ZHIYUAN/p/7895077.html
總結(jié)
- 上一篇: DataFrame
- 下一篇: Python Selenium + ph