题目描述

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

输入输出格式

输入格式:

第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1。

接下来一行有n个正整数,依次为那n个装置的初始弹力系数。

第三行有一个正整数m,

接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。

输出格式:

对于每个i=1的情况,你都要输出一个需要的步数,占一行。

输入输出样例

输入样例#1: 复制

4
1 2 1 1
3
1 1
2 1 1
1 1
输出样例#1: 复制

2
3

说明

对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000

解题思路

  LCT不会,或者分块。

  分成$\sqrt{n}$块,对于每个格子,维护三个值——$a[i]$第$i$个点的弹力系数,即弹射距离;$nxtn[i]$,弹射到下一个块所需的步数;$nxtp[i]$,从第i个点开始跳,直到离开这个块时的下一个位置(便于统计是一个块一个块地跳)。

  输入数据后,从后向前递推求出$nxtp[i]$和$nxtn[i]$。

  询问从$x$点开始,要弹飞所需的步数,就从$x$开始,利用$nxtp[i]$暴力跳块,用$nxtn[i]$暴力统计答案,直到飞了,输出答案。

  修改第$x$个点的弹力系数,就先把$a[x]$的值修改了,然后从后往前暴力递推$x$所在块的$nxtp[i]$和$nxtn[i]$。

源代码

 #include<stdio.h>
#include<math.h> int n,t,m;
int a[]/*弹力*/,nxtp[]/*到下一块的位置*/,nxtn[]/*到下一块的步数*/; int main()
{
//freopen("test.in","r",stdin);
scanf("%d",&n);
t=sqrt(n);//块数
for(int i=;i<n;i++)
{
scanf("%d",a+i);
}
for(int i=n-;i>=;i--)//i/t获得块数
{
if(i+a[i]>=n) nxtp[i]=n,nxtn[i]=;
else if(i/t!=(i+a[i])/t) nxtp[i]=i+a[i],nxtn[i]=;
else nxtp[i]=nxtp[i+a[i]],nxtn[i]=+nxtn[i+a[i]];
}
scanf("%d",&m);
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==)
{
int x;
scanf("%d",&x);
int ans=;
while(x<n)
{
ans+=nxtn[x];
x=nxtp[x];
}
printf("%d\n",ans);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
a[x]=y;
for(int i=(x/t+)*t;i>=x/t*t;i--)
{
if (i + a[i] >= n)
nxtp[i] = n, nxtn[i] = ;
else if (i / t != (i + a[i]) / t)
nxtp[i] = i + a[i], nxtn[i] = ;
else
nxtp[i] = nxtp[i + a[i]], nxtn[i] = + nxtn[i + a[i]];
}
}
}
return ;
}

洛谷 P3203 BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊的更多相关文章

  1. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 9071  Solved: 4652[Submi ...

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

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

  3. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT

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

  4. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 4055  Solved: 2172[Submi ...

  5. bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...

  6. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2843  Solved: 1519[Submi ...

  7. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意: 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆 ...

  9. 【刷题】BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊

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

随机推荐

  1. Geometry Shader 实现 Wireframe 绘制边线的Shader

    最终效果: 参考了一个免费插件 https://assetstore.unity.com/packages/vfx/shaders/directx-11/ucla-wireframe-shader-2 ...

  2. bzoj4506: [Usaco2016 Jan]Fort Moo(暴力)

    4506: [Usaco2016 Jan]Fort Moo Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 145  Solved: 104[Submi ...

  3. Android之条形码、二维码扫描框架(非原创)

    文章大纲 一.条形码.二维码扫描框架介绍二.条形码.二维码的区别和组成结构介绍三.条形码.二维码扫描框架应用场景四.BGAQRCode-Android框架实战五.项目源码下载六.参考文章 一.条形码. ...

  4. ZOJ-3960 What Kind of Friends Are You?

    What Kind of Friends Are You? Time Limit: 1 Second      Memory Limit: 65536 KB Japari Park is a larg ...

  5. Linux C编程 GCC的使用

    本篇文章面向一些会linux文件操作与vim基本命令,编程大佬请移步勿喷. gcc是默认安装的,但是其还缺少常用的头文件和库文件,所以还需要build-essential这个包,可以在联网状态下使用如 ...

  6. ACM_Hailstone HOTPO

    Hailstone HOTPO Time Limit: 2000/1000ms (Java/Others) Problem Description: The hailstone sequence is ...

  7. 6.13---shiro

  8. 观察者模式(observer)c++实现

    1意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2别名 依赖(Dependents), 发布-订阅(Publish-Subscribe ...

  9. CF861B Which floor?

    思路: 暴力枚举. 实现: #include <bits/stdc++.h> using namespace std; int n, m, x, y; bool check(int x, ...

  10. html与html5 总结

    时间:于2017年12月3日 19:35:18开始 用于: 这文章用于个人技术总结(全文转发请标明出处,小段摘抄随意) HTML笔记1.html标签不区分大小写,但是建议小写2.常用标签: 可用在he ...