您的位置:首页 > 其它

bzoj 2002 弹飞绵羊 分块

2017-07-09 21:46 155 查看
正解lct,然而本
d91d
蒟蒻并不会....

分块思路很清晰,处理出每个点弹出所在块所需要的步数及出去后的第一个位置#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define N 200005
using namespace std;
int n,m,nn,k
,nxt
,ned
,be
,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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: