【BZOJ2002】【HNOI2010】弹飞绵羊 [分块]
弹飞绵羊
Time Limit: 10 Sec Memory Limit: 259 MB
[Submit][Status][Discuss]
Description
某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。
Input
第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,
接下来一行有n个正整数,依次为那n个装置的初始弹力系数。
第三行有一个正整数m,
接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。
Output
对于每个i=1的情况,你都要输出一个需要的步数,占一行。
Sample Input
1 2 1 1
3
1 1
2 1 1
1 1
Sample Output
3
HINT
对于20%的数据:n,m<=10000;
对于100%的数据:n<=200000,m<=100000.
Main idea
给定一个位置,走一步可以走到一个指定位置,求走到n以外需要几步,走到的指定位置需要支持修改。
Solution
考虑暴力显然不可做,运用分块,维护两个信息:1.走出当前分块需要几步;2.走出当前分块后到了哪个点。
每次修改更新改点信息以及该块内的点,又因为一个点不一定只影响到该块内直接跳到这个点的点,也有间接关系的可能性存在,直接倒着搜一遍每次在可以跳到的点+1即可。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE=; int n,Q,P;
int T,x,y;
int num,to;
int a[ONE],To[ONE],F[ONE];
int go,jishu;
int PD[ONE];
int l[ONE],r[ONE]; struct power
{
int step;
int to;
int from;
}C[ONE]; int get()
{
int res,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} int Query(int x)
{
int j=x;
int Ans=;
while(j<=n)
{
Ans+=C[j].step;
j=C[j].to;
}
return Ans;
} int Update(int x,int y)
{
int j=x;
To[x]=x+y;
if(To[x]>n) To[x]=n+; jishu=;
while(C[j].from==C[x].from)
{
j=To[j];
jishu++;
}
C[x].step=jishu; C[x].to=j; for(int i=x-;i>=l[C[x].from];i--)
{
int y=To[i];
if(C[i].from==C[y].from)
{
C[i].to=C[y].to;
C[i].step=C[y].step+;
}
} } int main()
{
// freopen("input.in","r",stdin);
// freopen("input.out","w",stdout);
n=get();
Q=sqrt(n);
for(int i=;i<=n;i++)
{
a[i]=get(); To[i]=i+a[i]; if(To[i]>n) To[i]=n+;
if(!((i-)%Q))
{
num++;
l[num]=i;
}
C[i].from=num; r[num]=i;
} for(int i=;i<=n;i++)
{
int j=i;
jishu=;
while(C[j].from==C[i].from)
{
j=To[j];
jishu++;
}
C[i].step=jishu;
C[i].to=j;
if(C[i].to>n) C[i].to=n+;
} T=get();
while(T--)
{
P=get();
if(P==)
{
x=get(); x++;
printf("%d\n",Query(x));
} if(P==)
{
x=get(); x++;
y=get();
Update(x,y);
} }
}
【BZOJ2002】【HNOI2010】弹飞绵羊 [分块]的更多相关文章
- [HNOI2010] 弹飞绵羊 (分块)
[HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ...
- 【分块】[HNOI2010]弹飞绵羊&分块大法祭
分块(似乎还有一种动态树(LCT)做法) 第一次学习分块,似乎有点小激动 这是黄学长的分块入门博客「分块」数列分块入门1 – 9 by hzwer 题目描述 某天,Lostmonkey发明了一种超级弹 ...
- [luogu3203 HNOI2010] 弹飞绵羊 (分块)
传送门 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...
- BZOJ2002[Hnoi2010]弹飞绵羊——LCT
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
- 洛谷 P3203 [HNOI2010]弹飞绵羊 分块
我们只需将序列分成 n\sqrt{n}n 块,对于每一个点维护一个 val[i]val[i]val[i],to[i]to[i]to[i],分别代表该点跳到下一个块所需要的代价以及会跳到的节点编号.在 ...
- BZOJ2002 [HNOI2010] 弹飞绵羊
LCT access完了一定splay再用!!! 悲伤= = LCT裸题 把调出去设虚点n+1即可 //Love and Freedom. #include<cstdio> #includ ...
- 「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...
- 【BZOJ2002】弹飞绵羊(Link-Cut Tree)
[BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...
- P3203 [HNOI2010]弹飞绵羊(LCT)
P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ...
- 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...
随机推荐
- 近期准备发布我的asp.net框架
此框架为超轻量级架构,适合做中小型的b/s项目
- request.getparameter() 获取中文出现乱码 问题
http请求是以ISO-8859-1的编码来传送url的 如果页面的content-type为utf-8,那么在发送请求时,会将字符转成utf-8后进行传送 如: 中 的UTF-8编码为:E4 B8 ...
- python 基础篇 06 编码 以及小知识点补充
本节主要内容: 1. is和==的区别2. 编码的问题 ⼀. is和==的区别1. id()通过id()我们可以查看到⼀个变量表⽰的值在内存中的地址 注 ----<<<在pytho ...
- libvirt保持虚拟机运行情况下修改名称
通过virsh list命令能看到虚拟机的列表: [root@compute2 ~]# virsh list Id 名称 状态 ------------------------------------ ...
- Cassandra 常见错误索引
类型错误 类型错误调试的技巧 有时候,类型错误提示比较不友好,比如不知道哪个字段出错. 在php中可以用 //过滤几个数据进行操作,逐个检查,或者折半查找错误 $data = array_splice ...
- BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块
Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...
- nopcommerce商城系统--文档整理
原址:http://www.nopcommerce.com/documentation.aspx nopCommerce文档可以帮助您一步一步的搭建属于您自己的在线商城.根据该文档说明,您可以选择您想 ...
- [CCF] 201612-2 工资计算
[思路]按照题意对初始工资S进行循环,计算缴税后工资,若与T相等则退出循环,输出结果. #include <iostream> #include <windows.h> usi ...
- Oracle解决索引碎片功能
我们开始时向一个空的带索引的表中插入大量数据后,是不会产生碎片问题的,但是,数据库经过很长一段时间的增删改查后,难免会出现碎片问题,影响数据库的性能,Oracle对于这一问题有自己的解决方案. 下面介 ...
- Struts1之html标签
Struts1的html标签主要是为了绘制HTML页面标签元素,通过与Struts1框架的集成,增强功能 首先,在使用前,需要引入tld文件 <%@ taglib prefix="ht ...