当前位置: 首页 > news >正文

(分块)洛谷 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;}
http://www.jsqmd.com/news/1348055/

相关文章:

  • PDF转Word文档怎么转?盘点7款主流转换工具,免费靠谱方案一网打尽
  • Java入门9 类和对象
  • md2notion开发详解:从convert到uploadBlock的实现原理
  • ncmdumpGUI:如何将网易云音乐NCM文件转换为通用音频格式
  • ADR与SIEM集成:构建全面安全监控体系
  • 2026年新能源零部件新势力:重庆铝合金压铸企业如何靠完整产业链突围主机厂供应链 - 市场沸点
  • 《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》第三次印刷
  • 对话记忆管理实战,BufferMemory、SummaryMemory、EntityMemory对比
  • 本地宝推荐!温州非急救救护车转运联系渠道,全车型按需调配 - 滚动商讯
  • AutowareArchitectureProposal规划模块设计原理:场景选择与轨迹生成
  • PForth vs 传统Forth:为什么这款C实现的解释器更适合跨平台开发?
  • NestJS + Kafka 秒杀系统完整实践总结
  • Voice Builder资源库使用指南:音频文件管理与语音特征提取技巧
  • MoneyPrinterTurbo终极指南:10分钟生成专业级短视频的革命性工具
  • 揭秘NixThePlanet工作原理:QEMU虚拟化与Nix包管理的完美结合
  • B站字幕下载终极指南:3步轻松获取BiliBiliCCSubtitle字幕资源
  • 河北钨钢圆环供应商怎么选认准任丘市恒纳模具有限公司 - 品牌优推
  • 2026 重庆铝合金压铸产业观察:全产业链一体化制造成为新能源零部件核心竞争力 - 市场沸点
  • 从0到1开发macOS命令行工具:dark-mode项目架构与实现详解
  • 警惕!硬盘频繁休眠的危害与hd-idle的安全使用建议
  • 2026石家庄装修公司推荐:新房/二手房装修避坑指南 - 品牌优企推荐
  • MFC框架解析:从消息映射到文档视图,掌握Windows桌面开发核心
  • GetQzonehistory:三步极速备份QQ空间,让青春回忆永不褪色
  • qt生成dump文件并定位异常
  • TrollFools源码解析:深入理解MachO文件处理与dylib加载机制
  • NocoDB数据导出技术解析:架构设计与最佳实践
  • 3分钟找回你的QQ空间青春:GetQzonehistory开源备份工具全解析
  • 保持Teams在线状态:Powershellisfun防止自动变为离开状态的终极技巧
  • 为什么选择RaspberryIO?.NET开发者的树莓派硬件控制利器
  • 终极BitTorrent加速方案:83个公共Tracker实战配置深度指南