news 2026/8/7 19:09:44

(分块)洛谷 P3203 弹飞绵羊 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(分块)洛谷 P3203 弹飞绵羊 题解

题意

L 在地上沿着一条直线摆上nnn个装置,每个装置设定初始弹力系数kik_iki,当绵羊达到第iii个装置时,它会往后弹kik_iki步,达到第i+kii+k_ii+ki个装置,若不存在第i+kii+k_ii+ki个装置,则绵羊被弹飞。

绵羊想知道当它从第iii个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,L 可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

输入:

第一行包含一个整数nnn,表示地上有nnn个装置,装置的编号从0∼n−10 \sim n-10n1

接下来一行有nnn个正整数,依次为那nnn个装置的初始弹力系数。

第三行有一个正整数mmm,表示操作次数。接下来mmm行每行至少有两个数i,ji,ji,j

  • i=1i=1i=1,你要输出从编号为jjj的装置出发被弹几次后被弹飞

  • i=2i=2i=2,则还会再输入一个正整数kkk,表示编号为jjj的弹力装置的系数被修改成kkk

1≤n≤2×1051\le n \le 2\times 10^51n2×1051≤m≤1051\le m \le 10^51m105

思路

upd:一年后回来复健 OI 了,复习到分块看到这道题。

太久没有看过题目,我是根据查询时候,发现维护全局的跳跃终点和跳跃次数是O(1)O(1)O(1)的,但是修改牵一发而动全身需要O(n)O(n)O(n)。遇到这种就要想到用分块均衡:

考虑牺牲查询时候的复杂度,变为O(n)O(\sqrt{n})O(n),转为维护块内每个点跳出块的落点toito_itoi和次数cnticnt_icnti。这样修改块内某个值的时候,因为其他块的参数指向后继块,这些参数只与块内的kkk有关,所以修改当前块对其他块没有影响

voidupd(ll x){ll l=bl[x],r=br[x];for(inti=l;i<=r;i++)to[i]=cnt[i]=0;for(inti=r;i>=l;i--){if(i+a[i]>r)to[i]=i+a[i],cnt[i]=1;elseto[i]=to[i+a[i]],cnt[i]=cnt[i+a[i]]+1;}}//原则上修改一个点会影响前面所有点的答案,但是如此维护只影响块内该点的前驱//修改是容易的,块内维护前驱即可...llquery(ll x){ll ret=0;while(x<=n){ret+=cnt[x];x=to[x];//跳跃保持根号复杂度,to与块有关?}returnret;}//每个块的to,cnt相对独立

代码

复健一天写的代码奇短无比,不知道以前在干什么……

#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstll N=2e5+9;ll n,Q;ll a[N];ll bSize,cnt_b,bel[N],bl[N],br[N];ll to[N],cnt[N];voidupd(ll x){ll l=bl[x],r=br[x];for(inti=l;i<=r;i++)to[i]=cnt[i]=0;for(inti=r;i>=l;i--){if(i+a[i]>r)to[i]=i+a[i],cnt[i]=1;elseto[i]=to[i+a[i]],cnt[i]=cnt[i+a[i]]+1;}}voidinit(){bSize=sqrt(n);cnt_b=n/bSize;if(n%bSize)cnt_b++;for(inti=1;i<=n;i++)bel[i]=(i-1)/bSize+1;for(inti=1;i<=cnt_b;i++){bl[i]=(i-1)*bSize+1;br[i]=i*bSize;}br[cnt_b]=n;for(intx=1;x<=cnt_b;x++)upd(x);}voidmodify(ll x,ll k)//指向块外的,修改只影响块内{ll bx=bel[x];a[x]=k;upd(bx);}llquery(ll x){ll ret=0;while(x<=n){ret+=cnt[x];x=to[x];//跳跃保持根号复杂度,to与块有关?}returnret;}intmain(){scanf("%lld",&n);for(inti=1;i<=n;i++)scanf("%lld",&a[i]);init();scanf("%lld",&Q);while(Q--){ll op,x,k;scanf("%lld%lld",&op,&x);x++;if(op==1)printf("%lld\n",query(x));else{scanf("%lld",&k);modify(x,k);}}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 19:08:45

Shader Toy与Shadertoy.com兼容性指南:无缝迁移你的GLSL代码

Shader Toy与Shadertoy.com兼容性指南&#xff1a;无缝迁移你的GLSL代码 【免费下载链接】shader-toy Shadertoy-like live preview for GLSL shaders in Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/sh/shader-toy Shader Toy是一款强大的Visual Stu…

作者头像 李华
网站建设 2026/8/7 19:08:30

硬件工程师笔试基础题目

目录 1、对于电器设备来讲,它的开断能力的强弱对于该电气设备有着较大的影响。一般情况下需要合理地确定短路计算时间,在校验电气设备开断能力时,以下计算短路时间正确的是( )。 2、若万用表无“OFF”档位,当万用表使用完毕后,则转换开关应转到( )位置。 3、在传感器…

作者头像 李华
网站建设 2026/8/7 19:08:10

为什么选择RaspberryIO?.NET开发者的树莓派硬件控制利器

为什么选择RaspberryIO&#xff1f;.NET开发者的树莓派硬件控制利器 【免费下载链接】raspberryio The Raspberry Pis IO Functionality in an easy-to-use API for Mono/.NET/C# 项目地址: https://gitcode.com/gh_mirrors/ras/raspberryio RaspberryIO是一款专为.NET开…

作者头像 李华
网站建设 2026/8/7 19:06:05

实战指南:基于 .NET Aspire 的微服务电商架构深度解析

实战指南&#xff1a;基于 .NET Aspire 的微服务电商架构深度解析 【免费下载链接】eShop A reference .NET application implementing an eCommerce site 项目地址: https://gitcode.com/GitHub_Trending/es/eShop 在当今云原生时代&#xff0c;构建可扩展、高可用的电…

作者头像 李华
网站建设 2026/8/7 19:05:17

WindFM部署教程:3步轻松搭建你的风电预测系统

WindFM部署教程&#xff1a;3步轻松搭建你的风电预测系统 【免费下载链接】WindFM 项目地址: https://ai.gitcode.com/hf_mirrors/NeoQuasar/WindFM WindFM是一款专业的风电预测系统&#xff0c;能够帮助用户精准预测风力发电量&#xff0c;优化能源管理。本教程将带你…

作者头像 李华
网站建设 2026/8/7 19:04:20

Torrentio:Stremio流媒体生态的智能资源聚合引擎

Torrentio&#xff1a;Stremio流媒体生态的智能资源聚合引擎 【免费下载链接】torrentio-scraper 项目地址: https://gitcode.com/GitHub_Trending/to/torrentio-scraper 还在为寻找高质量影视资源而苦恼吗&#xff1f;Torrentio作为Stremio生态中最受欢迎的插件&#…

作者头像 李华