BZOJ 2002 HNOI2010 弹飞绵羊 分块

题目大意及LCT版本题解:见 http://blog.csdn.net/popoqqq/article/details/38849471

今天手滑用分块又重写了一遍这道题0.0 分块就是短啊

将弹簧分为√n块

对于每个弹簧 我们记录一下从这个弹簧出发直到弹到块外为止的弹跳次数及落点

查询沿着落点弹到出去为止 修改从块开始到这个点为止修改一遍

这样修改和查询都是O(√n)的

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 200200
using namespace std;
int n,m,ans,block,a[M];
int pos[M],times[M];
int main()
{
	int i,j,p,x,y;
	cin>>n;
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	block=static_cast<int>(sqrt(n)+1e-7);
	for(i=n-1;~i;i--)
	{
		int temp=i+a[i];
		if(temp>=n)
			pos[i]=-1,times[i]=1;
		else if(temp>=(i/block+1)*block)
			pos[i]=temp,times[i]=1;
		else
			pos[i]=pos[temp],times[i]=times[temp]+1;
	}
	cin>>m;
	for(i=1;i<=m;i++)
	{
		scanf("%d",&p);
		if(p==1)
		{
			scanf("%d",&x);
			ans=0;
			for(j=x;~j;j=pos[j])
				ans+=times[j];
			printf("%d\n",ans);
		}
		else
		{
			scanf("%d%d",&x,&y);
			a[x]=y;
			for(j=x;j>=x/block*block;j--)
			{
				int temp=j+a[j];
				if(temp>=n)
					pos[j]=-1,times[j]=1;
				else if(temp>=(j/block+1)*block)
					pos[j]=temp,times[j]=1;
				else
					pos[j]=pos[temp],times[j]=times[temp]+1;
			}
		}
	}
}
时间: 2024-12-09 08:54:08

BZOJ 2002 HNOI2010 弹飞绵羊 分块的相关文章

BZOJ 2002 Bounce 弹飞绵羊(分块|暴力|)(困难)

Bounce 弹飞绵羊 Time Limit:10000MS     Memory Limit:265216KB     64bit IO Format:%lld & %llu Submit Status Practice HYSBZ 2002 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后

bzoj 2002 Bounce 弹飞绵羊(分块)

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 11202  Solved: 5698[Submit][Status][Discuss] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹k

【bzoj 2002】弹飞绵羊

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

BZOJ 2002 HNOI2010 弹飞羊 块

标题效果,LCT解释版本:见 http://blog.csdn.net/popoqqq/article/details/38849471 如今,用一只手滑动块,并再次改写这个问题0.0 块短啊 将进入春天√n片 对于每一个弹簧的 我们记录一下从这个弹簧出发直到弹到块外为止的弹跳次数及落点 查询沿着落点弹到出去为止 改动从块開始到这个点为止改动一遍 这样改动和查询都是O(√n)的 #include<cmath> #include<cstdio> #include<cstring

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

[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞.为了使得游戏更有趣,Los

【codevs2333】&amp;【BZOJ2002】弹飞绵羊[分块]

我其实是在codevs上看到它的题号后才去做这道题的...2333... 题目传送门:codevs:http://codevs.cn/problem/2333/ bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意已经说的很清晰了,蓝鹅--我不会做. 看题解有两种写法:分块和link-cut tree.但是lct我不会,只能用分块了. 但是怎么分块呢? 我们想一下有什么暴力写法.一种是记录每个反弹装置能往后弹多长距离,这样效率是

HNOI2010 弹飞绵羊

codevs 2333 弹飞绵羊 http://codevs.cn/problem/2333/ 2010年省队选拔赛湖南 题目描述 Description Lostmonkey发明了一种超级反弹装置.为了在绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿一条直线摆放 n个反弹装置,并按从前往后的方式将反弹装置依次编号为 0 到 n-1,对 0≤i≤n-1,为第 i 个反弹装置设定了初始弹力系数 ki,当绵羊落到第 i 个反弹装置上时,它将被往后弹出 ki 步,

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

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

B2002 [Hnoi2010]Bounce 弹飞绵羊 分块

原来做过,看大家都做这道题都热情高涨,沈爷爷debug这道题4天,作为告诉他这个题的人,我还有点不好意思...我自己也就做了一个小时. 其实这个题思路还好,就是维护每个点的出块次数和跳出块的位置,然后访问的时候直接调用块. 这个题还有一个比较坑的地方,就是每个绵羊只有到队尾的时候才会被弹飞,所以不用担心在中间停止的情况. 题干: Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿