[luogu3203 HNOI2010] 弹飞绵羊 (分块)
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
4
1 2 1 1
3
1 1
2 1 1
1 1
Sample Output
2
3
Solution
比较简单的分块
对每个分块维护两个值:跳出这个块需要的次数、跳出这个块后所在位置
那么查询和修改就很简单了~
Code
//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
using namespace std;
int rd() {
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
	return x*f;
}
const int N=200010;
int n,q,blo;
int da[N],cnt[N],to[N],bl[N],l[N],r[N];
void init() {
	R(i,1,n) {
		if(bl[i]!=bl[i+1]) r[bl[i]]=i;
		if(bl[i]!=bl[i-1]) l[bl[i]]=i;
		if(i+da[i]>n) cnt[i]=1,to[i]=n+1;
		else if(i+da[i]>r[bl[i]]) cnt[i]=1,to[i]=i+da[i];
		else cnt[i]=cnt[i+da[i]]+1,to[i]=to[i+da[i]];
	}
}
void query(int x) {
	int ans=0;
	while(x!=n+1) ans+=cnt[x],x=to[x];
	printf("%d\n",ans);
	return ;
}
void change() {
	int x=rd()+1,k=rd();
	da[x]=k;
	R(i,l[bl[x]],x) //1
		if(i+da[i]>n) cnt[i]=1,to[i]=n+1;
		else if(i+da[i]>r[bl[i]]) cnt[i]=1,to[i]=i+da[i];
		else cnt[i]=cnt[i+da[i]]+1,to[i]=to[i+da[i]];
}
int main() {
	n=rd(); blo=sqrt(n);
	F(i,1,n) da[i]=rd(),bl[i]=(i-1)/blo+1;
	init();
	q=rd();
	while(q--) {
		int opt=rd();
		if(opt==1) query(rd()+1);
		else change();
	}
	return 0;
}
[luogu3203 HNOI2010] 弹飞绵羊 (分块)的更多相关文章
- [HNOI2010] 弹飞绵羊 (分块)
		[HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ... 
- 【分块】[HNOI2010]弹飞绵羊&分块大法祭
		分块(似乎还有一种动态树(LCT)做法) 第一次学习分块,似乎有点小激动 这是黄学长的分块入门博客「分块」数列分块入门1 – 9 by hzwer 题目描述 某天,Lostmonkey发明了一种超级弹 ... 
- luogu3203 [HNOI2010]弹飞绵羊
		lct裸题 #include <iostream> #include <cstdio> using namespace std; int n, ski[200005], m, ... 
- 洛谷 P3203 [HNOI2010]弹飞绵羊 分块
		我们只需将序列分成 n\sqrt{n}n 块,对于每一个点维护一个 val[i]val[i]val[i],to[i]to[i]to[i],分别代表该点跳到下一个块所需要的代价以及会跳到的节点编号.在 ... 
- 「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告
		P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ... 
- P3203 [HNOI2010]弹飞绵羊(LCT)
		P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ... 
- 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告
		P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ... 
- [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)
		[BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ... 
- [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)
		题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ... 
随机推荐
- TensorFlow 入门之手写识别(MNIST) 数据处理 一
			TensorFlow 入门之手写识别(MNIST) 数据处理 一 MNIST Fly softmax回归 准备数据 解压 与 重构 手写识别入门 MNIST手写数据集 图片以及标签的数据格式处理 准备 ... 
- vim 插件配置博客记录
			本来打算自己写下各种经常使用vim的插件安装方法, 可是搜索了下, 发现别人都写过了, 在写一遍也没有意思, 特此记录. Vim 经常使用命令 http://blog.csdn.net/hittata ... 
- C#  SortedDictionary<TKey, TValue> 类
			表示依据键进行排序的键/值对的集合. https://msdn.microsoft.com/zh-cn/library/f7fta44c.aspx 
- hdu2276---Kiki & Little Kiki 2(矩阵)
			Problem Description There are n lights in a circle numbered from 1 to n. The left of light 1 is ligh ... 
- 具体解释Hibernate中的事务
			1.前言 上一篇博客解说了Hibernate中的一级缓存,属于Session级别的.这篇博客解说一下Hibernate中的事务机制. 有关事务的概念.请參照通俗易懂数据库中的事务. 2.怎样处理Hi ... 
- Leetcode45:Intersection of Two Linked Lists
			Write a program to find the node at which the intersection of two singly linked lists begins. For ex ... 
- Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位
			 <Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位> Android本身的ListView拉到顶部或者底部会在顶部/底部边缘间隙出现一道"闪光&quo ... 
- Linux环境中Apache也就是httpd服务的启动,查看版本等操作
			本机是虚拟机,装的redhat Linux版本,默认是安装了httpd的 打开terminal 切换到root用户 cd到/etc/rc.d/init.d/目录,并列出该目录下的所有文件,看看是否有h ... 
- 【cl】selenium实例一:打开百度,获取第四个标题
			/*创建类的时候是TestNG Class*/ package Selenium_lassen; import static org.junit.Assert.*; import java.util. ... 
- SQL SERVER 读书笔记:非聚集索引
			对于有聚集索引的表,数据存储在聚集索引的叶子节点,而非聚集索引则存储 索引键值 和 聚集索引键值.对于非聚集索引,如果查找的字段没有包含在索引键值,则还要根据聚集索引键值来查找详细数据,此谓 Book ... 
