洛谷 P3203 [HNOI2010]弹飞绵羊
2024-09-01 05:39:09
题意简述
有n个点,第i个点有一个ki,表示到达i这个点后可以到i + ki这个点
支持修改ki和询问一点走几次能走出所有点两个操作
题解思路
分块,
对于每个点,维护它走到下一块所经过的点数,它走到下一块到的店的编号
每次修改只会对这块左端点到这个点产生影响
代码
#include <cmath>
#include <cstdio>
using namespace std;
struct Point{
int k, s, x, num;
}p[200010];
int n, m, len, ii, ans;
void update(int x)
{
int xx = x + p[x].k;
if (xx >= n) p[x].s = 1, p[x].x = -1;
else if (p[x].num != p[xx].num) p[x].s = 1, p[x].x = xx;
else p[x].s = p[xx].s + 1, p[x].x = p[xx].x;
}
int main()
{
scanf("%d", &n);
len = sqrt(n);
for (register int i = 0; i < n; ++i)
{
scanf("%d", &p[i].k);
p[i].num = i / len;
}
for (register int i = n - 1; i + 1; --i)
update(i);
scanf("%d", &m);
for (register int i = 1; i <= m; ++i)
{
int opt;
scanf("%d", &opt);
if (opt == 1)
{
int cnt = 0;
scanf("%d", &ii);
for (ans = 0; ii != -1; ans += p[ii].s, ii = p[ii].x)
++cnt;
printf("%d\n", ans);
}
else
{
scanf("%d", &ii);
scanf("%d", &p[ii].k);
for (register int j = ii; j >= 0 && p[j].num == p[ii].num; --j)
update(j);
}
}
}
最新文章
- Arc GIS engine10.2与VS2012的安装及匹配步骤
- 缺少.lib文件导致的Link2019 解决方案汇总
- 错误-spring3.2的架构在tomcat6.0中无法正常启动,抛出java.lang.NoClassDefFoundError: javax/servlet/AsyncListener
- javascript语言精粹
- ue4 重新生成ide project文件的命令行
- Dynamics AX 2012 R2 报表部署权限错误
- C语言 函数理解(以数组做参数)
- JQuery onload、ready概念介绍及使用方法
- (转载)Nim游戏博弈(收集完全版)
- [OC] UITabBarController
- Sublime字体设置
- ORACLE 动态注册和静态注册的区别(转)
- 框架基础:ajax设计方案(二)---集成轮询技术
- iOS View 模糊效果(毛玻璃)
- [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib
- <;input>;标签单、复选相关查询地址
- ELK 日志分析实例
- VB6 加载水晶报表例子
- debian8安装harbor
- 判别式模型 vs. 生成式模型