bzoj 2002 弹飞绵羊 分块

来源:互联网 发布:js css display 编辑:程序博客网 时间:2024/05/24 15:41

正解lct,然而本蒟蒻并不会....

分块思路很清晰,处理出每个点弹出所在块所需要的步数及出去后的第一个位置

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#define N 200005using namespace std;int n,m,nn,k[N],nxt[N],ned[N],be[N],tot;int opt,aa,bb,ans;void work(int x){int l=(x-1)*nn+1,r=x*nn;r=min(r,n);for(int i=r;i>=l;i--){if(i+k[i]>r){ned[i]=1;nxt[i]=i+k[i];}else{ned[i]=ned[i+k[i]]+1;nxt[i]=nxt[i+k[i]];}}}int main(){scanf("%d",&n);nn=sqrt(n); for(int i=1;i<=n;i++){scanf("%d",&k[i]);            be[i]=(i-1)/nn+1;}tot=be[n];for(int i=1;i<=tot;i++) work(i);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&opt,&aa);aa++;if(opt==1){ans=0;while(aa<=n){ans+=ned[aa];aa=nxt[aa];}printf("%d\n",ans);}else{scanf("%d",&bb);k[aa]=bb;work(be[aa]);}}return 0;}

原创粉丝点击