题目描述

某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

输入输出格式

输入格式:

第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000

输出格式:

对于每个i=1的情况,你都要输出一个需要的步数,占一行。

输入输出样例

输入样例#1:

4
1 2 1 1
3
1 1
2 1 1
1 1

输出样例#1:

2
3

这题脑洞很大啊……如果不事先知道可以用分块解,怕是真想不到分块

将装置分块,记录每个装置在所属块内的弹跳次数,和它跳到的下一个块内的装置。这样修改弹力的时候,只需要修改同一个块内装置的弹跳次数和后驱。

 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxn=200020;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 int block,cnt;
16 int B[mxn],L[mxn],R[mxn];
17 int nxt[mxn],k[mxn],w[mxn];
18 int n,m;
19 int clc(int st){
20     int res=0;
21     while(st<=n && st){
22         res+=w[st];
23         st=nxt[st];
24     }
25     return res;
26 }
27 int main(){
28     n=read();
29     int i,j;
30     for(i=1;i<=n;i++)k[i]=read();
31     block=sqrt(n);
32     cnt=(n-1)/block+1;
33     for(i=1;i<=cnt;i++){
34         L[i]=R[i-1]+1;
35         R[i]=i*block;
36 //        printf("L:%d R:%d\n",L[i],R[i]);
37     }
38     R[cnt]=min(R[cnt],n);
39     for(i=1;i<=n;i++)B[i]=(i-1)/block+1;
40     for(i=n;i;i--){
41         if(i+k[i]>n)w[i]=1;
42         else if(B[i]==B[i+k[i]]){
43                 w[i]=w[i+k[i]]+1;
44                 nxt[i]=nxt[i+k[i]];
45             }
46             else{
47                 w[i]=1;
48                 nxt[i]=i+k[i];
49             }
50     }
51     m=read();
52     int op,x,y;
53     while(m--){
54         op=read();
55         if(op==1){
56             x=read()+1;
57             printf("%d\n",clc(x));
58         }
59         else{
60             x=read()+1;y=read();
61             k[x]=y;
62             for(i=x;i>=L[B[x]];i--){
63                 if(B[i]==B[i+k[i]]){
64                     w[i]=w[i+k[i]]+1;
65                     nxt[i]=nxt[i+k[i]];
66                 }
67                 else{
68                     w[i]=1;
69                     nxt[i]=i+k[i];
70                 }
71             }
72         }
73     }
74     return 0;
75 }

转载于:https://www.cnblogs.com/SilverNebula/p/6035965.html

[HNOI2010]BOUNCE 弹飞绵羊相关推荐

  1. AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203

    [HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  2. 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...

  3. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 10761  Solved: 5542 [Su ...

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

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  5. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  6. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...

  7. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊

    n<=200000个点,从i会跳到$i+num_i$,保证$num_i>0$,m<=100000个两种操作:一.修改一个$num$:二.问从$i$开始跳多少步跳出这个序列. 大概是L ...

  8. bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【LCT】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一道LCT,调了3天,发现是智障bug,我的青春... 主要参考了黄学长的代码,也没 ...

  9. 分块-洛谷P3203 [HNOI2010]BOUNCE 弹飞绵羊

    https://www.luogu.org/problem/show?pid=3203#sub 这道题第一次TLEl,然后改了改变成AC: 所以说这种题目,时限卡得很紧,一定要思考理论复杂度和常数的问 ...

最新文章

  1. div+css控制最小高度又自适高度
  2. 计算机网络·通俗理解RIP协议(距离向量算法计算)
  3. Boost:异步操作,涉及重新打包多个操作,但选择仅调用其中一个的测试程序
  4. MGTemplateEngine 模版发动机简单使用
  5. HIPS 自定义框架
  6. 前端速成班_在此速成班中学习Go
  7. [高效时间管理]复盘篇
  8. 【图像算法】彩色图像分割专题五:提取彩色图像上特定色彩
  9. 信息学奥赛一本通C++语言——1040:输出绝对值
  10. 別人的心得。。。。。學習
  11. 【Android】Intent传递对象(序列化)
  12. 常用的HTML5和CSS3标签及用法(入门篇)
  13. 主板24pin接口详图_24Pin接口再见!华擎推出首款ATX12VO标准的Z490主板
  14. Grand Canyon
  15. 6成人跳槽为钱,最新裸辞调查报告出炉!
  16. gazebo设置_GAZEBO学习笔记(3)
  17. Android自定义弹窗模仿微信,Android 仿微信朋友圈点赞和评论弹出框功能
  18. linux最大文件名,linux和windows文件名长度限制
  19. linux相关的东东,来自dbanotes
  20. 南开大学20春计算机应用基础在线作业,南开大学20春学期计算机应用基础在线作业参考答案...

热门文章

  1. JS 删除 cookie
  2. 用strings命令查看kafka-log内容 过滤二进制编码
  3. Software-testing-foundations-homework3
  4. 浅谈块级元素和行级元素的相对定位和绝对定位问题
  5. 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
  6. 深入解析thinkphp中的addAll方法
  7. 配置解压版本的Tomcat为Windows服务
  8. 设置ComboBox控件的小箭头颜色.
  9. QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文步骤
  10. php sqlserver开发实例,Linux_用sql脚本创建sqlserver数据库范例语句,下面是创建一个sqlserver数据库 - phpStudy...