Brief description

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

Algorithm design

因为太弱不会用lct,所以我们使用分块做Orz

考察暴力解法:

第一种暴力做法就是修改的时候直接\(\Theta(1)\)修改,查询的时候要\(\Theta(n)\)查询。

第二种暴力做法就是修改的时候把所有的答案重新递推出来,复杂度\(\Theta(n)\),查询的时候就可以\(\Theta(1)\)查询了。

我们考虑分块把两种方法结合起来。设分块的大小为\(h(n)\)。

首先我们预处理出来每个点跳出当前块需要多少步,并且跳出之后会落在哪里。

考虑修改。对于每个点,如果我们修改,会导致所有可以到达它的点的答案变化。我们只修改块内的答案,不难证明这样做是可行的。复杂度\(\Theta(h(n))\)

考虑查询。根据预处理信息,我们可以方便的查询。

Code

#include <cmath>
#include <cstdio>
#include <cstring>
const int maxn = 200100;
const int inf = 0x3f3f3f;
int n, m, f[maxn], g[maxn], h[maxn], k[maxn], block;
int id(int x) {
if (block != 0)
return (x - 1) / block + 1;
return 1;
}
int main(int argc, char const *argv[]) {
#ifndef ONLINE_JUDGE
freopen("input", "r", stdin);
#endif
scanf("%d", &n);
block = (int)sqrt(n);
memset(f, -1, sizeof(f));
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
f[i] = i + x;
if (f[i] > n)
f[i] = -1;
k[i] = -1;
h[i] = -1;
g[i] = inf;
}
k[n + 1] = 0;
for (int i = n; i >= 1; i--) {
if (f[i] != -1) {
k[i] = k[f[i]] + 1;
if (id(i) == id(f[i])) {
g[i] = g[f[i]] + 1;
h[i] = h[f[i]];
} else {
g[i] = 1;
h[i] = f[i];
}
} else {
k[i] = 1;
g[i] = 1;
h[i] = -1;
}
}
scanf("%d", &m);
while (m--) {
int opt;
scanf("%d", &opt);
if (opt == 1) {
if (block == 0) {
printf("0\n");
continue;
}
int x;
scanf("%d", &x);
x++;
int ans = 1;
while (f[x] != -1) {
if (h[x] != -1) {
ans += g[x];
x = h[x];
} else {
x = f[x];
ans++;
}
}
printf("%d\n", ans);
}
if (opt == 2) {
if (block == 0)
continue;
int x, y;
scanf("%d %d", &x, &y);
x++;
f[x] = x + y;
k[x] = k[y] + 1;
if (f[x] > n)
f[x] = -1;
if (id(y) == id(x))
g[x] = g[y] + 1, h[x] = h[y];
else
g[x] = y, h[x] = 1;
for (int i = x; id(i) == id(x) && i; i--) {
if (f[i] != -1) {
k[i] = k[f[i]] + 1;
if (id(i) == id(f[i])) {
g[i] = g[f[i]] + 1;
h[i] = h[f[i]];
} else {
g[i] = 1;
h[i] = f[i];
}
} else {
k[i] = 1;
g[i] = 1;
h[i] = -1;
}
}
}
}
return 0;
}

[bzoj2002][Hnoi2010]Bounce弹飞绵羊——分块的更多相关文章

  1. bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]

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

  2. bzoj2002 [Hnoi2010]Bounce 弹飞绵羊——分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一次用分块,感觉超方便啊: 如果记录每个点的弹力系数,那么是O(1)修改O(n)查询 ...

  3. bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 分块

    这个题体现了分块不只是最大值最小值众数次数,而是一种清真的思想. 我们把整个序列分块,在每个块里处理每个位置跳出这个块的次数和跳出的位置,那么每次修改n0.5,每次查询也是,那么O(m* n0.5)的 ...

  4. BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 【LCT】【分块】

    BZOJ2002 Hnoi2010 Bounce 弹飞绵羊 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始, ...

  5. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

    [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...

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

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  7. [bzoj2002][Hnoi2010]Bounce弹飞绵羊_LCT

    Bounce弹飞绵羊 bzoj-2002 Hnoi-2010 题目大意:n个格子,每一个格子有一个弹簧,第i个格子会将经过的绵羊往后弹k[i]个,达到i+k[i].如果i+k[i]不存在,就表示这只绵 ...

  8. 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊 分块/LCT

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

  9. bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 这一题除了LCT解法,还有一种更巧妙,代码量更少的解法,就是分块.先想,如果仅仅记录每 ...

随机推荐

  1. BZOJ 1968 [Ahoi2005]COMMON 约数研究:数学【思维题】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1968 题意: 设f(x) = x约数的个数.如:12的约数有1,2,3,4,6,12,所以 ...

  2. 不同浏览器css引入外部字体的方式

    /** * 字体后缀和浏览器有关,如下所示 * .TTF或.OTF,适用于Firefox 3.5.Safari.Opera * .EOT,适用于Internet Explorer 4.0+ * .SV ...

  3. pytest 测试报告

    测试报告 运行测试用例后,为了保存结果,我们需要生成测试报告,同时可以把运行的测试报告发送相关人员查阅,这时需要安装一个插件(pytest-html) pytest-html插件安装 pip inst ...

  4. 孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1

    孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1 (完整学习过程屏幕记录视频地址在文末) 感觉用requests获取到网页的html源代码后,更重要的工作其实是分析得到的内 ...

  5. 初学者学习python2还是python3?

    如果你是一个初学者,或者你以前接触过其他的编程语言,你可能不知道,在开始学习python的时候都会遇到一个比较让人很头疼的问题:版本问题!!是学习python2 还是学习 python3 ?这是非常让 ...

  6. 软工实践 - 第二十八次作业 Beta 冲刺(6/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10146478.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  7. zufe 蓝桥选拔

    https://zufeoj.com/contest.php?cid=1483 问题 A: A 代码: #include <bits/stdc++.h> using namespace s ...

  8. 【历史】- UNIX发展史(BSD,GNU,linux)

    先前的一個理想 UNIX 系统自 1969 年 Ken Thompson 与 Dennis Ritchie 在美国贝尔电话实验室(Bell Telephone Laboratories)发展出雏形至今 ...

  9. element-ui的el-tabel组件怎么使用type=“expand”实现表格嵌套并且在子表格没有数据的时候隐藏展开按钮

    效果如下: 试过很多种办法,思路都在怎么控制<el-table-column type="expand">里面的type上,比如使用v-show等等,但是发现,要不就是 ...

  10. 并发(一) Semaphore

    Semaphore 控制对资源的并发访问数,构造时如果传参为1,则近似于ReentrantLock,差别在于锁的释放.可以一个线程获取锁,另外一个线程释放锁,在一些死锁处理的场合比较适用. 如上所示, ...