1. 程式人生 > >【bzoj2002】彈飛綿羊——分塊

【bzoj2002】彈飛綿羊——分塊

pac ace 代碼 print using () amp scanf spa

這道題是很簡單的分塊吧,統計每個塊裏要中轉的次數(即st數組),最後輸出即可。

如果修改某個彈力裝置的彈力系數,那麽要從這個裝置開始往回走到這一塊的最左端(即l[belong[b]]),修改相對應的st數組和pt數組,它前面的塊和後面的塊都不受影響(因為st統計的是走到這一步到走出這一個裝置所屬的塊所需的步數)。

具體實現細節看代碼:

技術分享
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
const int
maxn=200010; using namespace std; int n,m,block,cnt; int pt[maxn],st[maxn],k[maxn],belong[maxn]; int l[1005],r[1005]; void print(int w) { int t=0; do{ t+=st[w]; w=pt[w]; }while(w); printf("%d\n",t); } int main() { scanf("%d",&n); block=sqrt(n); for(int i=1;i<=n;i++) scanf(
"%d",&k[i]); if(n%block)cnt=n/block+1; else cnt=n/block;//cnt存的是塊的塊數 for(int i=1;i<=cnt;i++) { l[i]=(i-1)*block+1; r[i]=i*block; } for(int i=1;i<=n;i++) belong[i]=(i-1)/block+1; for(int i=n;i>=1;i--) { if(i+k[i]>n)st[i]=1;
else if(belong[i]==belong[i+k[i]]) st[i]=st[i+k[i]]+1,pt[i]=pt[i+k[i]]; else st[i]=1,pt[i]=i+k[i]; } scanf("%d",&m); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d %d",&a,&b); b++; if(a==1)print(b); else{ scanf("%d",&c); k[b]=c; for(int j=b;j>=l[belong[b]];j--) { if(belong[j]==belong[j+k[j]]) st[j]=st[j+k[j]]+1,pt[j]=pt[j+k[j]]; else st[j]=1,pt[j]=j+k[j]; } } } return 0; }
View Code

【bzoj2002】彈飛綿羊——分塊