博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
块状链表 codevs 2333弹飞绵羊
阅读量:7210 次
发布时间:2019-06-29

本文共 939 字,大约阅读时间需要 3 分钟。

块状链表,分块处理,先预处理每一个点跳到下一个块 跳到哪,步数。然后修改的时候,修该那一个块即可

#include<cstdio>

#include<cmath>
int a[200006],n,m,b[200006],c[200006],dian[200006],l[200006],r[200006];
int main()
{
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
   scanf("%d",&a[i]);
 int len,len1;
 len1=floor(sqrt(n));
 len=n/len1;
 if(len1*len1!=n)
   len++;
 for(int i=1;i<=len;i++)
   {
    l[i]=(i-1)*len1+1;
    r[i]=i*len1;
   }
 r[len]=n;
 for(int i=1;i<=n;i++)
   dian[i]=(i-1)/len1+1;
 for(int i=len;i>0;i--)
   for(int j=r[i];j>=l[i];j--)
     {
     if(j+a[j]>r[i])
     {
      b[j]=j+a[j];
      c[j]=1;
     }
     else
     {
      b[j]=b[j+a[j]];
      c[j]=c[j+a[j]]+1;
     }
  }
 scanf("%d",&m);
 for(int i=0;i<m;i++)
   {
    int a1,a2,a3;
    scanf("%d%d",&a1,&a2);
    a2++;
    if(a1==1)
      {
       int sum=0;
       for(int j=a2;j<=n;j=b[j])
         sum+=c[j];
       printf("%d\n",sum);
   }
  else
    {
     scanf("%d",&a3);
     a[a2]=a3;
     for(int j=a2;j>=l[dian[a2]];j--)
     {
       if(j+a[j]>r[dian[a2]])
     {
      b[j]=j+a[j];
      c[j]=1;
     }
               else
     {
      b[j]=b[j+a[j]];
      c[j]=c[j+a[j]]+1;
     }
    }
 }
   }
 return 0;
}

转载于:https://www.cnblogs.com/xydddd/p/5130865.html

你可能感兴趣的文章
如何理解阿里月饼事件中各方的表现
查看>>
浅谈line-height
查看>>
php二维数组指定其键名对其排序的方法
查看>>
用什么PHP框架最好?框架?还不如用开源系统吧
查看>>
JS 设计模式 一(接口)
查看>>
ios category 笔记整理(一)
查看>>
神经网络很萌的
查看>>
关系数据库SQL之可编程性存储过程
查看>>
Yii2 日期和时间组件
查看>>
[实战] 用数人云,部署弹性 ELK 集群就五步
查看>>
h5端呼起摄像头扫描二维码并解析
查看>>
用babel cli编译用ES6写的JSX
查看>>
程序是生活的抽象
查看>>
koa源码分析-generator和yield分析
查看>>
如何在内部 Stash 服务器上添加 hook
查看>>
细节:js 对象继承的几种模式举例
查看>>
Docker工具箱继续增加
查看>>
Git如何生成多个ssh key添加到ssh-agent管理项目
查看>>
阿里巴巴合伙人闻佳:创新背后的文化与组织
查看>>
应对深度学习人才缺口,百度黄埔学院发起深度学习架构师培养计划 ...
查看>>