弹飞绵羊

题目的网址为:

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

题目大意

有N个点,每个点有一个系数a[i],你处于位置i可以走到i+a[i],若i+a[i]>n则你走出了地图。
现M个操作有两种:
1、把a[j]修改为k。
2、询问你位于点j时,需要走多少部走出地图。

数据范围

1<=n<=200000, 1<=m<=100000。

题解

这是一道经典的LCT(动态树)例题,然而,我这个蒟蒻,并不会用动态树,我只会分块这种相对低级的方法。

将原序列分成 n√ {\sqrt n} 块, ei e_i表示当前 i i跳出ii所在的那一块需要的步数, eni en_i表示跳出块后的位置。

执行询问操作时,只需要不断地跳出下一个块,跳到不能再跳为止,最多跳 n√ {\sqrt n} 次。具体实现如下:

    ans:=0;while op<=n dobeginans:=ans+e[op];op:=en[op];end;

执行修改操作时,只需修改本块中在该数之前的 ei e_i和 eni en_i,从前往后修改,最多修改 n√ {\sqrt n} 次。具体实现如下:

    for o:=op downto l do  //l为op所在块中的左边界beginif o+k[o]>r then   //r为op所在块中的右边界beginen[o]:=u;e[o]:=1;endelsebeginen[o]:=en[u];e[o]:=e[u]+1;end;end;

初始化的方法跟在执行修改操作时的更新方法差不多,就不多讲了。
总时间复杂度 O O(mm n√ {\sqrt n} ),分块算法,奥妙重重!

Code(Pascal)

vark,en,ne:array[0..300000] of longint;ku,l,r,i,j,m,n,o,p,u,op,ans:longint;
function min(a,b:Longint):longint;beginif a<b then exit(a)else exit(b);end;
beginreadln(n);for i:=1 to n doread(k[i]);ku:=trunc(sqrt(n));p:=n div ku;if n mod p<>0 then inc(ku);for i:=1 to ku dobeginl:=(i-1)*p+1;r:=min(i*p,n);for o:=r downto l dobeginu:=o+k[o];if u>r thenbeginen[o]:=u;ne[o]:=1;endelsebeginen[o]:=en[u];ne[o]:=ne[u]+1;end;end;end;readln(m);for i:=1 to m dobeginread(op);if op=1 thenbeginreadln(op);inc(op);ans:=0;while op<=n dobeginans:=ans+ne[op];op:=en[op];end;writeln(ans);endelsebeginreadln(op,u);inc(op);k[op]:=u;l:=(op div p)*p+1;r:=l+p-1;if op mod p=0 thenbeginl:=l-p;r:=r-p;end;for o:=op downto l dobeginu:=o+k[o];if u>r thenbeginen[o]:=u;ne[o]:=1;endelsebeginen[o]:=en[u];ne[o]:=ne[u]+1;end;end;end;end;
end.

BZOJ 2002 Bounce 弹飞绵羊 [Hnoi2010]相关推荐

  1. bzoj 2002 Bounce 弹飞绵羊

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

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

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

  3. 【bzoj 2002】弹飞绵羊

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

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

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

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

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

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

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

  7. HYSBZ - 2002 :Bounce 弹飞绵羊 (分块算法)

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

  8. Bounce 弹飞绵羊

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

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

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

最新文章

  1. 即将到来的金三银四,这10道springboot常见面试题你需要了解下
  2. mysql 1449 : The user specified as a definer ('root'@'%') does not exist
  3. MySQL数据表基本操作
  4. 从互联网的旁观者,转为互联网的建设者,推动者!!!
  5. cigarettes(香烟)
  6. matlab中waitbar用法,matlab中waitbar
  7. SQL Server 数据库操作类
  8. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——B题 小宝的幸运数组
  9. mui打包ios_优品视界,聚合影视APP源码。mui框架,hbuilder即可编译,云打包生成ios的Android的app...
  10. mongodb 集群shard_MongoDB 分片集群环境搭建
  11. iPhone Xs和iPhoneXs max 的区别 哪个好
  12. 微信扫码下载APP,苹果,安卓多码合一,微信下载pdf报告,文件解决方案
  13. 【JoJo的摄影笔记】黎明女神的呼唤—— 佳能王朝霸业崛起
  14. redis之瘦小精干的位图 (一)
  15. 猿辅导国奖选手妈妈在线分享教育经:数学新生代的成长之路
  16. 王者苹果服务器转安卓系统,王者荣耀苹果用户可以转?王者荣耀苹果用户转安卓的方法教程...
  17. 等额本金和等额本息房贷公式推导
  18. 国产飞腾服务器制作raid
  19. CefSharp的ChromiumWebBrowser截出来的图片是空白
  20. 运用OpenCV对图像进行红眼校正

热门文章

  1. 苹果笔记本怎么安装python_苹果系统MAC下如何安装Python解释器
  2. [转]AIR中调用exe或者bat可执行文件
  3. vue拖拽组件(app移动端)
  4. 制造工程与技术(机加工)
  5. Http- Post/Get请求参数值最大限制问题
  6. 开车人千金难买的知识!(组图)
  7. 「老板娘」马东敏回归百度的880天
  8. C# 读取EXCEL数据丢失,6万行数据只能读取13866行
  9. 第1.5章:StarRocks部署--集群部署
  10. __attribute__((packed)) C