bzoj2002 弹飞绵羊 分块

Posted 友人A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2002 弹飞绵羊 分块相关的知识,希望对你有一定的参考价值。

这道题是分块的初尝试 讲给定的区间n进行分块处理 这个每次修改的复杂的只有logn 很方便

代码是学黄学长的 http://hzwer.com/3505.html

当然里面还是有一定我自己的想法在里面的 嫌我代码丑的可以去看黄学长的咯 

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int M=200007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
}
int n,m,block,sum;
int stp[M],w[M],fa[M],belong[M];
int l[1005],r[1005];
int push_ans(int x){
    int ans=0;
    while(1){
        ans+=stp[x];
        if(!fa[x]) break;
        x=fa[x];    
    }
    return ans;    
}
int main()
{
    n=read(); block=sqrt(n);
    for(int i=1;i<=n;i++) w[i]=read();
    if(n%block) sum=n/block+1;
    else sum=n/block;
    for(int i=1;i<=sum;i++) l[i]=r[i-1]+1,r[i]=i*block;
    r[sum]=n;
    for(int i=1;i<=n;i++) belong[i]=(i-1)/block+1;
    for(int i=n;i;i--){
        if(i+w[i]>n) stp[i]=1;
        else if(belong[i]==belong[i+w[i]]) stp[i]=stp[i+w[i]]+1,fa[i]=fa[i+w[i]];
        else stp[i]=1,fa[i]=i+w[i];
    }
    int k,x,y;
    m=read();
    for(int i=1;i<=m;i++){
        k=read();
        if(k==1) x=read()+1,printf("%d\n",push_ans(x));
        else{
            x=read()+1; y=read(); w[x]=y;
            for(int j=x;j>=l[belong[x]];j--){
                if(belong[j]==belong[j+w[j]]) stp[j]=stp[j+w[j]]+1,fa[j]=fa[j+w[j]];
                else stp[j]=1,fa[j]=j+w[j];
            }
        }
        //for(int j=1;j<=n;j++) printf("[%d %d] ",fa[j],stp[j]); printf("\n");
    }
    return 0;
}
View Code

 

以上是关于bzoj2002 弹飞绵羊 分块的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2002弹飞绵羊——分块

[BZOJ2002] Bounce 弹飞绵羊(分块)

[BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)

bzoj 2002[Hnoi2010]Bounce 弹飞绵羊(分治分块)

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]

BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊(分块)