CF Gym 102428J Jumping Grasshoper 题解

题目大意是,我们需要维护一个数列,支持对其进行修改和查询。
修改就是正常的单点修改,查询的话就有点不一样。
每一次查询的时候,我们会指定一个开始的位置和开始的方向。每一轮,我们向指定的方向找到第一个比当前位置高的地方,跳到那里,并将方向变为当前方向相反的那一个方向。
如果当前方向没有找到能够跳到的地方,那就停下。我们需要找到最后会停在哪里,并输出之。
题目保证每一时刻都没有两个高度是相同的。

我们设当前的这个位置为 p p p

首先我们可以猜测,这个停下的位置一定会是起点左右的某一个最大值。
因为我们每一次查询的过程一定是在反复在起点的两侧跳跃。

为了分析方便,我们把这两个值的下标都取出来,分别称作 m a x l maxl maxl m a x r maxr maxr

然后我们开始分类讨论:

首先要考虑到的一种情况就是当前的位置已经是哪里都不能去了,即 a m a x l < a p a_{maxl} < a_p amaxl<ap a m a x r < a p a_{maxr} < a_p amaxr<ap
那就直接输出 p p p 就好了。

然后是两种次级情况。

一是左边没有比当前高的,但是右边有;二是右边没有比当前高的,但是左边有。

这两种情况的决策与开始时的方向有关,这里只拿第一种情况做例子。

如果开始时的方向是向左,那我们跳一次之后方向就会变成向右。
我们设这个位置是 m i n l minl minl
因为有 a p > a m a x r a_p > a_{maxr} ap>amaxr,所以有 a m i n l > a m a x r a_{minl} > a_{maxr} aminl

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值