洛谷 P3203 [HNOI2010]BOUNCE 弹飞绵羊(分块)

news/2024/10/31 1:26:00/

题目描述

某天,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的情况,你都要输出一个需要的步数,占一行。

输入输出样例

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

蒟蒻不会LCT,只能用分块写了 QAQ

program df;
var i,j,n,m,x,y,z,k,t,xx,l,r:longint;
a,b,c,d:array[0..200000] of longint;

procedure check1(x:longint);
var i:longint;
begin
i:=0;
while x<=n do
begin
i:=i+d[x];
x:=c[x];
end;
writeln(i);
end;

procedure check(x,y:longint);
var i,j,l,r,xx:longint;
begin
a[x]:=y;
l:=(x div k)*k+1;
r:=l+k-1; //找到x所在区间
if x mod k=0 then //此时x在上一个区间的末尾,所以属于上个区间(区间为左闭右开)
begin
l:=l-k;
r:=r-k;
end;
for i:=x downto l do //更新跳出这个块的时间
begin
xx:=i+a[i];
if xx>r then
begin
c[i]:=xx;
d[i]:=1;
end
else
begin
c[i]:=c[xx];
d[i]:=d[xx]+1;
end;
end;
end;

begin
readln(n);
for i:=1 to n do
read(a[i]);
t:=trunc(sqrt(n));
k:=n div t;
if n mod k<>0 then inc(t);
for i:=1 to t do
begin
l:=(i-1)*k+1;
r:=i*k;
if r>n then r:=n;
for j:=r downto l do
begin
xx:=j+a[j];
if xx>r then
begin
c[j]:=xx; //j在下一个块的位置
d[j]:=1; //跳出这个块的时间为1
end
else
begin
c[j]:=c[xx]; //j在下一个块的位置与xx在下个块的位置相同
d[j]:=d[xx]+1; //j跳出的时间是xx跳出的时间+1
end;
end;
end;
readln(m);
for i:=1 to m do
begin
read(x);
if x=1 then begin readln(y); check1(y+1); end;
if x=2 then
begin
readln(y,z);
check(y+1,z);
end;
end;
end.

转载于:https://www.cnblogs.com/Gxyhqzt/p/7784231.html


http://www.ppmy.cn/news/148738.html

相关文章

使用U盘安装操作系统

前些天对门寝室朋友的电脑系统崩溃啦&#xff0c;让我过去帮忙弄一下。要是在平时我三两下就给他弄好啦&#xff0c;但是那天却把我给难住啦&#xff0c;为什么呢&#xff1f;那是因为他的光驱是坏的&#xff0c;⊙﹏⊙b汗&#xff0c;无法正常读取系统安装盘&#xff0c;是怎么…

Stack与Queue

Stack(栈) 堆栈&#xff08;Stack&#xff09;代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时&#xff0c;则使用堆栈。当您在列表中添加一项&#xff0c;称为推入元素&#xff0c;当您从列表中移除一项时&#xff0c;称为弹出元素。 方法 Clear(); 从 S…

c语言程序设计P320,《C程序设计》作业内容

《《C程序设计》作业内容》由会员分享,可在线阅读,更多相关《《C程序设计》作业内容(11页珍藏版)》请在人人文库网上搜索。 1、实验一 C语言的运行环境的使用一、目的与要求1. 了解Windows系统下C语言的运行环境,熟悉C程序调试、运行的基本操作方法。2. 熟练掌握编辑、编译、…

第十章第十题(Queue类)(Queue class)

第十章第十题&#xff08;Queue类&#xff09;&#xff08;Queue class&#xff09; *10.10&#xff08;Queue类&#xff09;10.6节给出了一个Stack类。设计一个名为Queue的类用于存储整数。像栈一样&#xff0c;队列保存元素。在栈中&#xff0c;元素以“后进先出”的方式获取…

联想微型计算机急救方法,lenovo微型计算机电脑无法启动文件丢失怎么办

满意答案 pd_bzx236 2015.11.22 采纳率:53% 等级:9 已帮助:417人 1、使用Windows启动盘 如果启动问题是由于活动分区的启动记录或者操作系统启动所使用的文件被破坏造成的,启动盘就能够解决问题。具体方法如下: 创建Windows启动盘,找一台配置相似、工作正常的Windows …

Stack类、Queue类和Deque类常用方法(防止忘记)

Stack类 栈&#xff08;Stack&#xff09;是一种后进先出&#xff08;LIFO&#xff09;的数据结构&#xff0c;操作栈的元素的方法有&#xff1a; 把元素压栈&#xff1a;push(E) 把栈顶的元素“弹出”&#xff1a;pop(E) 取栈顶元素但不弹出&#xff1a;peek(E) 在Java中&am…

联想工作站 装linux系统安装,分区、代码 - 在ThinkPad上安装Ubuntu的全过程详解_Linux教程_Linux公社-Linux系统门户网站...

分区 由于Thinkpad出厂时已经占用了一个隐藏分区来做HPA&#xff0c;而一个硬盘上最多能有四个主分区&#xff0c;其中扩展分区还占去了一个份额&#xff0c;因此分区方案的选择受到一点限制。我的分区方式如下&#xff1a; 代码: Device Filesystem Size Used Avail Use% Moun…

No binary rubies available for: osx/10.8/x86_64/ruby-1.9.2-p320解决

you need to run: rvm get head rvm autolibs enable rvm use --install 1.9.2 bundle install