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


    http://www.lydsy.com/JudgeOnline/problem.php?id=2002

    题意

    思路

    不会LCT,就只好用分块了。

    将这n个数分成根号n块,对于每一块中的每一个数,处理出它跳出它所在块的下一个位置和所需跳数。

    这样如果要修改x的话,我们只需要修改一个x所在的块即可。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<cmath>
    #include<map>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int INF = 0x3f3f3f3f;
    const int maxn = 200000+5;
    
    int n, m;
    int a[maxn],pos[maxn],jump[maxn];
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d",&n);
        for(int i=0;i<n;i++)  scanf("%d",&a[i]);
        int block = sqrt(n+0.5);
        for(int i=n-1;i>=0;i--)
        {
            int tmp = i+a[i];
            if(tmp>=n)  {pos[i]=-1;jump[i]=1;}
            else if(tmp>=(i/block+1)*block)  {pos[i]=tmp;jump[i]=1;}
            else {pos[i]=pos[tmp];jump[i]=jump[tmp]+1;}
        }
        scanf("%d",&m);
        while(m--)
        {
            int x,y;
            int op; scanf("%d",&op);
            if(op==1)
            {
                int ans = 0;
                scanf("%d",&x);
                for(int i=x;i!=-1;i=pos[i]) ans+=jump[i];
                printf("%d
    ",ans);
           }
           else
           {
               scanf("%d%d",&x,&y);
               a[x]=y;
               for(int i=x;i>=x/block*block;i--)
               {
                   int tmp = i+a[i];
                   if(tmp>=n)  {pos[i]=-1;jump[i]=1;}
                   else if(tmp>=(i/block+1)*block)  {pos[i]=tmp;jump[i]=1;}
                   else {pos[i]=pos[tmp];jump[i]=jump[tmp]+1;}
               }
           }
        }
        return 0;
    }
    

      

  • 相关阅读:
    SVN服务器搭建和使用(一)
    log4j.properties配置详解
    List<Map>来导出Excel数据
    JavaFX 表格数据显示简单Demo
    Java数组
    oracle数据 在已有的重复的数据上加联合唯一约束
    MyEclipse 9极速优化
    Eclipse中自定义Library
    Python 爬虫 1 (转)
    装修步骤 1
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7695638.html
Copyright © 2020-2023  润新知