这道题就很优秀了。考试的时候完全没想到正解,最后写了一个暴力20分…

直接讲分块吧。我们预处理两个数组 S t e p [ ] , G e t [ ] Step[],Get[] Step[],Get[],其中 S t e p [ i ] Step[i] Step[i]表示第 i i i个数跳到下一块需要的步数, G e t [ I ] Get[I] Get[I]表示第 i i i个数跳到下一块中的哪一个数,这样我们就只需要分块处理就可以了。

再讲一下预处理与查询与修改吧。

关于预处理:我们从后往前扫,判断一下当前的这个数与这个数直接跳的数是否处于同一个块中,如果是的话就直接 S t e p [ x ] = S t e p [ x + J u m p [ x ] ] + 1 , G e t [ x ] = G e t [ x + J u m p [ x ] ] Step[x]=Step[x+Jump[x]]+1,Get[x]=Get[x+Jump[x]] Step[x]=Step[x+Jump[x]]+1,Get[x]=Get[x+Jump[x]],不然的话就 S t e p [ x ] = 1 , G e t [ x ] = x + J u m p [ x ] Step[x]=1,Get[x]=x+Jump[x] Step[x]=1,Get[x]=x+Jump[x]。时间复杂度: O ( n ) O(n) O(n)

关于查询:我们从起点 x x x开始,先将步数记录 A n s + = S t e p [ x ] Ans+=Step[x] Ans+=Step[x],然后再跳过去 x = G e t [ x ] x=Get[x] x=Get[x],就这样循环一直到 G e t [ x ] = 0 Get[x]=0 Get[x]=0。时间复杂度: n \sqrt{n} n ​

关于修改:修改的话就最开始 J u m p [ x ] = y Jump[x]=y Jump[x]=y,然后我们循环 f o r ( i = x ; i > = L e f t [ B l o c k [ x ] ] ; i − − ) for(i=x;i>=Left[Block[x]];i--) for(i=x;i>=Left[Block[x]];i−−)预处理操作了。时间复杂度: n \sqrt{n} n ​

总时间复杂度: O ( n + m n ) O(n+m\sqrt{n}) O(n+mn ​)

参考代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define DB double
#define SG string
#define LL long long
using namespace std;
const LL Max=2e5+5;
const LL Mod=1e9+7;
const LL Inf=1e18;
LL N,M,S,SNum,L[Max],R[Max],Get[Max],Step[Max],Jump[Max],Block[Max];
inline LL Read(){LL X=0;char CH=getchar();bool F=0;while(CH>'9'||CH<'0'){if(CH=='-')F=1;CH=getchar();}while(CH>='0'&&CH<='9'){X=(X<<1)+(X<<3)+CH-'0';CH=getchar();}return F?-X:X;
}
inline void Write(LL X){if(X<0)X=-X,putchar('-');if(X>9)Write(X/10);putchar(X%10+48);
}
void Update(LL X,LL Y){LL I;Jump[X]=Y;for(I=X;I>=L[Block[X]];I--){if(Block[I]==Block[I+Jump[I]]){Step[I]=Step[I+Jump[I]]+1,Get[I]=Get[I+Jump[I]];} else {Step[I]=1,Get[I]=I+Jump[I];}}
}
LL Calc(LL X){LL Ans=0;while(true){Ans+=Step[X];X=Get[X];if(X==0){return Ans;}}
}
int main(){LL I,J,K;N=Read();S=sqrt(N);SNum=N/S;if(N%S!=0){SNum++;}for(I=1;I<=SNum;I++){L[I]=(I-1)*S+1;R[I]=I*S;}R[SNum]=N;for(I=1;I<=N;I++){Jump[I]=Read();   Block[I]=(I-1)/S+1;}for(I=N;I;I--){if(I+Jump[I]>N){Step[I]=1;} else if (Block[I]==Block[I+Jump[I]]) {Step[I]=Step[I+Jump[I]]+1;Get[I]=Get[I+Jump[I]];} else {Step[I]=1,Get[I]=I+Jump[I];}}M=Read();for(I=1;I<=M;I++){K=Read();if(K==1){LL X=Read()+1;Write(Calc(X)),putchar('\n');} else {LL X=Read()+1,Y=Read();Update(X,Y);}}return 0;
}

BZOJ P2002 [HNOI2010] 弹飞绵羊【分块】相关推荐

  1. BZOJ 2002 HNOI2010 弹飞绵羊 分块

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

  2. BZOJ 2002 Bounce 弹飞绵羊 [分块]

    本身是一道lct裸题,为了证明分块的优越性,可用性,强行写了一波不擅长的分块...GG 分块思路很优秀,每个点记录跳出分块的步数以及跳到下一分块的哪个点 #include<cmath> # ...

  3. P3203 [HNOI2010]弹飞绵羊

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

  4. BZOJ 2002 Bounce 弹飞绵羊 [Hnoi2010]

    弹飞绵羊 题目的网址为: http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题目大意 有N个点,每个点有一个系数a[i],你处于位置i可以走到i ...

  5. bzoj 2002 Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 时间限制: 10 Sec   内存限制: 259 MB 提交: 16133   解决: 8253 题目描述 某天,Lostmonkey发明了一种 ...

  6. 【HNOI 2010】Bounce 弹飞绵羊 分块

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

  7. 【bzoj 2002】弹飞绵羊

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

  8. BZOJ-2002-Bounce弹飞绵羊-分块

    描述 Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知 ...

  9. [HNOI2010]弹飞绵羊

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

最新文章

  1. AI 时代保护儿童刻不容缓!智源研究院发布我国首个儿童人工智能发展原则《面向儿童的人工智能北京共识》...
  2. 学生用的笔记本电脑什么样的好_大学生用的学生党笔记本什么牌子好,听听学姐的...
  3. 他们是最懂数据的商家!智能品牌时代到来
  4. HTTP响应头和请求头信息对照表(一篇全)
  5. python程序写蛇_python蟒蛇绘制程序
  6. Java历程-初学篇 Day05选择结构(2)
  7. 升级Webwork2.2版本注意点
  8. 使用Cron和PHP检测网页是否被篡改
  9. 用计算机如何算瓷砖菱形加工,瓷砖菱形铺贴怎么计算面积
  10. candence的图纸大小设置_Candence基础知识1(CADENCE从原理图到PCB步骤 )
  11. C++ rand的用法
  12. 刷爆全网:一个中科大差生的8年程序员工作总结~
  13. mysql error1205 博客_Mysql Error:1205错误诊断
  14. kali安装Netspeed
  15. 【中亦安图】导致Oracle性能抖动的参数提醒(4)
  16. STM32 USB 开发(二)HID Slave 通信 --- 简单上位机开发
  17. vue父传子mounted问题
  18. pytorch 中 混合精度训练(真香)
  19. 5G赋能行业:丢掉“传统”外衣,向“智”造加速
  20. Windows10或者11 使用Administrator登录

热门文章

  1. h5 调起相机_h5 调用相机、相册实现本地上传图片预览
  2. 区块链三加一:币圈骚扰套路,你中过招吗?
  3. 【树莓派不吃灰】命令篇⑨ 记录学习文件系统
  4. 正确使用计算机键盘的方法是,电脑键盘的正确保养方式
  5. 数据分析师 ---- SQL强化(3)
  6. sklearn之KNN算法
  7. 屏蔽罩对WiFi产品接收灵敏度的影响
  8. 来自程序媛的大数据分享(文中有彩蛋)
  9. 教程篇(6.0) 13. 数据泄露预防 (DLP) ❀ FortiGate 安全 ❀ Fortinet 网络安全专家 NSE 4
  10. 我国食品安全问题——看完了就不会有人再感慨奶粉事件了...