首页 > 其他分享 >Bounce 弹飞绵羊

Bounce 弹飞绵羊

时间:2024-04-17 11:14:26浏览次数:9  
标签:装置 last int ll 弹飞 弹力 Bounce step 绵羊

某天,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。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000

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

样例
样例输入
4
1 2 1 1
3
1 1
2 1 1
1 1
样例输出
2
3

image

怎么说呢,我就是菜
一开始听张云杰讲,感觉自己会了,就开搞了
以下是张云杰的讲解:
1.如果纯暴力模拟,那么查询就就会出锅
2.预先简单便利一遍,拿数组存一下,但很显然,修改就会出锅
3.所以要拿分块去解决2中的问题,怎么搞呢,修改出锅是因为会影响到前面的步数,但如果分块的话,就可以把这个影响减小到当前分块
分块
用一个数组存当前位置到下一个块的最短步数,再用一个数组存到跳到下个区块对应位置的下标,这样修改的话就仅用修改当前区块的状态
然后…………

void add(int x,int z){
	int p=vis[x];
	int k=x;
	a[x]=z;step[x]=0;
	while(k<=r[p]){
		step[x]++;
		k=k+a[k];
	}
	last[x]=k;
}

他就寄了,每回都差几个数
后面想了一下,发现不只是当前位置会改变,而是当前区块的所有经过它的点都会改变,所以就成了这样

void add(int x,int z){
	int p=vis[x];
	int k=x;
	a[x]=z;step[x]=0;
	for(int i=l[p];i<=x;i++){
		int k1=i;step[i]=0;
		while(k1<=r[p]){
			step[i]++;
			k1=k1+a[k1];
		}
		last[i]=k1;
	}
}

他就T了
后面询问了peppa pig(快说谢谢pig),虽然说的牛头不对马嘴,但告诉了我一个关键点,那就是DP
后面就简单推了一下(不会写公式)

if(j+a[j]>r[i]){step[j]=1;last[j]=j+a[j];}
else {
	step[j]=step[j+a[j]]+1;
	last[j]=last[j+a[j]];
}

很显然,前面的状态只能由后面转移过来,所以要倒叙
然后就没了

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=360010;
typedef long long ll;
ll a[N];
int l[N],r[N];
int vis[N];
ll step[N];
ll last[N];
ll lazy[N];
int n,m,b;
string s;
int x,y,z;
void div(){
	int sq=sqrt(n);
	for(int i=1;i<=sq;i++){
		l[i]=(i-1)*sq+1;
		r[i]=i*sq;
	}
	if(r[sq]<n){
		sq++;
		l[sq]=r[sq-1]+1;
		r[sq]=n;
	}
	for(int i=sq;i>=1;i--){
		for(int j=r[i];j>=l[i];j--){
			vis[j]=i;
			if(j+a[j]>r[i]){step[j]=1;last[j]=j+a[j];}
			else {
				step[j]=step[j+a[j]]+1;
				last[j]=last[j+a[j]];
			}
		}
	}
}
void add(int x,int z){
	int p=vis[x];
	a[x]=z;
	for(int i=r[p];i>=l[p];i--){
		step[i]=0;
		if(i+a[i]>r[p]){step[i]=1;last[i]=i+a[i];}
		else{
			step[i]=step[i+a[i]]+1;
			last[i]=last[i+a[i]];
		}
	}
}
ll query(int x){
	int k=x;long long ans=0;
	while(k<=n){
		ans+=step[k];
		k=last[k];
	}
	return ans;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	div();
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>z;
		if(z==1){
			cin>>b;
			cout<<query(b+1)<<endl;
		}
		else {
			cin>>b>>y;
			add(b+1,y);
		}
	}
}

标签:装置,last,int,ll,弹飞,弹力,Bounce,step,绵羊
From: https://www.cnblogs.com/PeppaEvenPigShiGeNiuBDePig/p/18140106

相关文章

  • 30 天精通 RxJS (14):Observable Operator - throttle, debounce
    昨天讲到了在UI操作上很常用的delay,今天我们接着要来讲另外两个也非常实用operators,尤其在做性能优化时更是不可或缺的好工具!Operatorsdebounce跟buffer、bufferTime一样,Rx有debounce跟debounceTime一个是传入observable另一个则是传入毫秒,比较常用到的是de......
  • 详细解读JavaScript中的防抖(debounce)和节流(throttle)!!!
    在JavaScript中,防抖(debounce)和节流(throttle)是两种常用的技术,用于限制函数的执行频率,特别是在处理高频事件(如窗口的resize、scroll,输入框的keyup、mousedown等)时非常有用。防抖(debounce)防抖的基本思想是将多次执行变为最后一次执行。也就是说,在事件被触发后n秒内函数只能执......
  • 关于lodash.debounce的配置
    最近在改一个bug的时候反馈说一个弹窗表单在快速多次的点击提交按钮时有可能重复提交,于是我在检查这个表单的时候发现他的防抖是这样配置的:submit1:debounce(function(){console.log(1);this.cancel(true);},500),乍一看好像没什么问题,于是我查询了文档 l......
  • P3203 弹飞绵羊 题解
    QuestionP3203[HNOI2010]弹飞绵羊一条直线上摆着\(n\)个弹簧,每个弹簧有一个弹力系数\(k_i\),当绵羊走到第\(i\)个弹簧时,会被弹到第\(i+k_i\)个弹簧,如果\(i+k_i>n\)则会被弹飞,有两个操作1x查询\(x\)处的绵羊经过几次会被弹飞2xy把\(x\)处的弹力系数改成......
  • postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程
     PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第35讲:中间件PgBouncer部署11月25日(周六)19:30-20:30,往期......
  • Vue防抖debounce
    在搜索框中随着输入内容而更新显示内容或者需要请求接口等逻辑时,如果每一个字符变化都去更新则会浪费一些没有必要的请求,想要的结果是某一个时间内不要去更新,就是常用的防抖测略Vue中防抖逻辑:在响应式的变量在包装一个响应式,新的响应式只有在一定时间到时才更新,具体如下export......
  • lodash中的debounce的用法及作用
    格式:debounce(fun,delay)fun:执行的函数delay:延迟时间作用:1、不使用debounce的情况:用户在连续输入文字时,会在每次输入时都会执行函数,有可能导致阻塞或项目崩溃$('.elements').on('input',(e)=>{console.log(e.target.value)})2、使用debouce的情况:用户在输入后的指定时间后......
  • Lodash _.debounce()用法及代码示例
    Lodash_.debounce()用法及代码示例Lodash是一个JavaScript库,可在underscore.js之上运行。Lodash帮助处理数组,字符串,对象,数字等。lodash中Function的_.debounce()方法用于创建一个反跳函数,该函数将给定的func延迟到自上次调用此反跳函数以来经过的指定等待时间(以毫秒为单位)......
  • Greenplum 数据库启用pgbouncer
    pgbouncer是PostgreSQL的轻量的连接池,可以有效降低连接数,提升系统性能。Greenplum当前版本已经自带,只是多数组织在实践中似乎并未启用此服务,也算是一种资源的浪费了。gpbouncer有三种连接方式:Sessionpooling/会话连接池最普通的方式,在客户端连接的时候,在它的连接生命期内,会给......
  • [DS记录] P3203 [HNOI2010] 弹飞绵羊
    (题目传送门)虽然是\(\rmLCT\)板子,但用来做分块入门如果没有修改操作,可以\(O(n)\)求出每个点的答案对于每个块里的点,预处理出它跳出这个块的步数,那么查询时就可以\(O(1)\)跳过这些块,查询的复杂度\(O(\sqrt{n})\)修改一个点时,也就是\(O(B)\)暴力修改即可令\(B=\sqrt{......