题目

题目链接

题意

据说这道题要用一道叫做LCT的数据结构,然而我不会。。。

一排有n个弹簧装置,从第iii个可一往后跳k[i]" role="presentation" style="position: relative;">k[i]k[i]k[i]步。

  • 修改:修改某个位置弹簧的弹性。
  • 查询:询问从某个位置出发弹多少次就弹飞了。

题解

分块首先都要先从暴力开始想起:
我们记录从任意一个点出发,下一次能跳到哪里,这样的话我们每次询问,只需要一只沿着这条链往下走即可,显然最坏的时间复杂度是O(n2)O(n2)O(n^2),修改的时间复杂度为O(1)O(1)O(1)。

优化:
让我们使用分块来进行优化,我们把一条直线上的n个弹簧进行分块,并对于每个弹簧记录两个属性:sum[i]sum[i]sum[i]和nxtb[i]nxtb[i]nxtb[i]。

其中sum[i]sum[i]sum[i]表示的含义是从iii弹簧出发在本块内的经过的节点的个数,nxtb[i]" role="presentation" style="position: relative;">nxtb[i]nxtb[i]nxtb[i]表示的是从ii<script type="math/tex" id="MathJax-Element-479">i</script>弹簧出发,弹到下一块中的第一个弹簧的编号,弹飞设置为-1。

这样的话,询问的时候我们只需要下面一段代码就可以了。

int now = x;
while(x != -1){ans += sum[now];now = nxtb[now];
}

预处理的话,我们要倒着往前计算,因为前面的sum用到了后面的sum。
预处理和修改的话详情请见代码。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 200007;
#define pr(x) cout<<#x<<":"<<x<<endl
int Base = 450;
int nxtb[maxn];
int val[maxn];
int sum[maxn];
int n,m,op,x,y;
inline void read(int &x){scanf(" %d",&x);
}
int main(){read(n);Base = (int) sqrt(n+0.5);for(int i = 1;i <= n;++i){read(val[i]);}for(int i = n;i >= 1;--i){int j = val[i] + i;int bl = i / Base;int br = j / Base;if(j > n){nxtb[i] = -1;sum[i] = 1;}else if(br == bl){//属于同一个块nxtb[i] = nxtb[j];sum[i] = sum[j]+1;}else{//不属于同一个块nxtb[i] = j;sum[i] = 1;}}read(m);while(m--){read(op);if(op == 1){//询问read(x);x++;int ans = 0;int now = x;while(now != -1){ans += sum[now];now = nxtb[now];}printf("%d\n",ans);}else{//修改read(x);read(y);x++;val[x] = y;int j = x + y;int bl = x / Base;int br = j / Base;if(j > n){sum[x] = 1;nxtb[x] = -1;}else if(bl == br){//属于用一个块sum[x] = sum[j] + 1;nxtb[x] = nxtb[j];}else{//不属于同一个块sum[x] = 1;nxtb[x] = j;}for(int i = x-1;i >= max(1,bl*Base);--i){//更新与x属于同一块的可能被x影响的弹簧。j = i + val[i];br = j / Base;if(br == bl){sum[i] = sum[j] + 1;nxtb[i] = nxtb[j];}}}}return 0;
}

洛谷-P3203 弹飞绵羊 分块相关推荐

  1. 洛谷P3203 弹飞绵羊

    题目背景 搞不懂为什么大家伙都叫 弹(dan)飞绵羊 这道题我是用来点亮洛谷试炼场的分块模板的- 当然使用分块做的啊! 然后L_Y_T想了想,就右转题解了- 然后发现题解的代码可读性极差 于是就了解思 ...

  2. #分块#洛谷 3203 弹飞绵羊

    题目 在地上沿着一条直线摆上 n n n个装置,每个装置设定初始弹力系数 k i ki ki,当绵羊达到第 i i i个装置时,它会往后弹 k i ki ki步,达到第 i + k i i+ki i+ ...

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

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

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

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

  5. BZOJ 2002 HNOI2010 弹飞绵羊 分块

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

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

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

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

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

  8. P3203 [HNOI2010]弹飞绵羊

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

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

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

最新文章

  1. 如何将键/值对添加到JavaScript对象?
  2. 通过简单的Linux命令,编译一个C语言代码
  3. 关于python 中的 sys.argv 的使用方法
  4. 十二个 ASP.NET Core 例子
  5. 4 error C2220: 警告被视为错误 - 没有生成“object”文件 (..\..\src\caffe\util\math_functions.cpp)
  6. 并发量,QPS,TPS,看这一篇就够了
  7. CAP BASE 最终一致性
  8. 用 Python 爬了 10 万个产品经理的信息:KPI 多高,锅就有多大!
  9. CCIE学习(4)——VLAN基础
  10. 中国电子学会c语言考试题库,计算机基础考试试题及答案
  11. C语言编译软件安装教程(Dev-C++版)
  12. 《我的成功可以复制》读后感
  13. 教务系统mysql注入的原理_SQL注入原理及具体步骤
  14. Windows的AppData 文件夹
  15. npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead.
  16. 【线性代数·浅学】(一)行列式——n阶行列式定义,行列式性质,行列式展开定理,拉普拉斯定理,范德蒙德行列式,克拉默法则
  17. element-ui中el-upload在ie10中无法上传相同图片的问题:XMLHttpRequest: 网络错误 0x2efd, 由于出现错误 00002efd 而导致此项操作无法完成。
  18. 资源小屋(更新ing.......)
  19. 红色警戒常用的快捷键
  20. Markdown怎么加入emoji

热门文章

  1. 算法题目——杨辉三角问题
  2. leetcode37. 解数独
  3. [mybatis]映射文件_select_resultMap_关联查询_association分步查询延迟加载
  4. dotcpp1115 DNA-打印图案
  5. poj3981 字符串替换-字符串的基本操作
  6. 多重背包问题以及二进制优化
  7. Memento(备忘录)--对象行为型模式
  8. Abstract Factory(抽象工厂)--对象创建模式
  9. 邻接表1试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下:icoding---算法改进--配详细注释
  10. Java8新特性解析