题目描述

某天,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

解题思路

分块经典例题,把这个长度为n的序列分成√n个,对于每段小区间,我们维护以下这几个值:

s[i]---从第i个点跳出该小区间需要的步数(step)

t[i]---跳出该小区间后会到达哪个节点(to)

查询时每次直接 step+=s[i],i=[i],复杂度不超过√n;

修改时直接赋值后把当前块暴力重建,复杂度为√n;

总时间复杂度O(m*√n)

总空间复杂度O(n)

分点信息(鼠标移到方块上有详细信息)

#1 AC 5ms/14937kB
#2 AC 284ms/14937kB
#3 AC 5ms/14937kB
#4 AC 265ms/14937kB
#5 AC 188ms/14937kB
#6 AC 274ms/14937kB
#7 AC 158ms/14937kB
#8 AC 292ms/14937kB
#9 AC 441ms/14937kB
#10 AC 448ms/14937kB

源代码

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5 #define LL long long
 6 using namespace std;
 7 const int N=200200;
 8 int k[N],bl[N],t[N],s[N];
 9 int blo,n,m,tot;
10 int read(){
11     int v=0,f=1;char c=getchar();
12     while(c>'9'||c<'0'){if(c=='-')f*=-1;c=getchar();}
13     while(c<='9'&&c>='0')v=v*10+c-'0',c=getchar();
14     return v*f;
15 }
16 void reset(int x){
17     for(int i=min(n,x*blo);i>=(x-1)*blo+1;i--){
18         int to=i+k[i];
19         if(to>min(n,x*blo))s[i]=1,t[i]=to;
20         else {
21             s[i]=s[to]+1;
22             t[i]=t[to];
23         }
24     }
25 }
26 int query(int x){
27     int rtn=0;
28     while(x<=n){
29         rtn+=s[x];
30         x=t[x];
31     }
32     return rtn;
33 }
34 void change(int x,int v){
35     k[x]=v;
36     reset(bl[x]);
37 }
38 int main(){
39     n=read();blo=sqrt(n);
40     for(int i=1;i<=n;i++){
41         k[i]=read();
42         bl[i]=(i-1)/blo+1;
43     }    44     tot=bl[n];
45     for(int i=1;i<=tot;i++)reset(i);
46     m=read();
47     while(m--){
48         int opt,p,v;
49         opt=read();
50         if(opt==1){
51             p=read();
52             printf("%d\n",query(p+1));
53         }
54         if(opt==2){
55             p=read();v=read();
56             change(p+1,v);
57         }
58     }
59     return 0;
60 } 

转载于:https://www.cnblogs.com/Anoxiacxy/p/6866755.html

[HNOI2010]弹飞绵羊相关推荐

  1. P3203 [HNOI2010]弹飞绵羊

    P3203 [HNOI2010]弹飞绵羊 题目描述 详见:P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题. 但是我并不想用LCT解决此题(In fact 是不会LCT ...

  2. HNOI2010——弹飞绵羊(lct)

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

  3. luogu P3203 [HNOI2010]弹飞绵羊(LCT ? 暴力分块 ! )

    整理的算法模板合集: ACM模板 已知:暴力 + 暴力 + 10510^5105 = 分块 设 need[i] 表示从 i 开始,跳出所在块的步数:ver[i] 表示跳出当前所在的块后到了哪里: 罗老 ...

  4. BZOJ 2002 HNOI2010 弹飞绵羊 分块

    题目大意及LCT版本题解:见 http://blog.csdn.net/popoqqq/article/details/38849471 今天手滑用分块又重写了一遍这道题0.0 分块就是短啊 将弹簧分 ...

  5. BZOJ2002 [HNOI2010] 弹飞绵羊

    LCT access完了一定splay再用!!! 悲伤= = LCT裸题 把调出去设虚点n+1即可 //Love and Freedom. #include<cstdio> #includ ...

  6. BZOJ P2002 [HNOI2010] 弹飞绵羊【分块】

    这道题就很优秀了.考试的时候完全没想到正解,最后写了一个暴力20分- 直接讲分块吧.我们预处理两个数组 S t e p [ ] , G e t [ ] Step[],Get[] Step[],Get[ ...

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

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

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

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

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

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

最新文章

  1. Codeforces 1108 E2(线段树+思维)
  2. 来自NASA的全球高程DEM数据
  3. java图遍历求最长路径_如何在Java中使用递归实现矩阵中最长路径的返回
  4. python做excel麻烦_高效办公必备:别人通宵做的 Excel,我用Python 半小时搞定!
  5. WebApp 里Meta标签大全
  6. weka使用训练集分类测试集_科学网—使用独立测试集对分类模型进行评估 - 李向东的博文...
  7. Java—多线程创建详解
  8. PingCAP创始人刘奇:TiDB设计理念进化与大规模实践
  9. Java中字节输入输出流
  10. partproble在RHEL 6下无法更新分区信息
  11. Linux运行shell脚本出现出错,可能是环境编码不一致造成的。
  12. 如何挖掘大数据的价值
  13. 局域网IP被抢占后如何强制夺回
  14. ORACLE的程序包1-程序包的基
  15. 在指定文件类型中递归查找到目标字符串
  16. 【自动驾驶控制算法】 第一讲 绪论
  17. 编程示例:公农历转换的算法
  18. 苹果youtube无法连接网络_解决苹果手机Apple ID被禁止下载或无法连接到AppStore等问题...
  19. 论文阅读_中文医学预训练模型_MC-BERT
  20. Matlab2019 slrt(XPC)目标机U盘启动

热门文章

  1. 《养老管理系统——“入住和费用”模块》项目研发阶段性总结
  2. Linux内核简介、版本号、发布历史及发行版
  3. fuzzing是什么
  4. 【Linux基础】Linux环境变量(超详细)
  5. angular 结合 nodejs连接数据库在webstorm服务器中启动
  6. python中的偏函数:partical function
  7. Hive调优技巧汇总
  8. 【Python】这个列表TTT熟悉
  9. 态棒,阿里的长矛还是利盾?
  10. PHP税前税后,php计算税后工资的方法