博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj2002】弹飞绵羊——分块
阅读量:4361 次
发布时间:2019-06-07

本文共 1550 字,大约阅读时间需要 5 分钟。

这道题是很简单的分块吧,统计每个块里要中转的次数(即st数组),最后输出即可。

如果修改某个弹力装置的弹力系数,那么要从这个装置开始往回走到这一块的最左端(即l[belong[b]]),修改相对应的st数组和pt数组,它前面的块和后面的块都不受影响(因为st统计的是走到这一步到走出这一个装置所属的块所需的步数)。

具体实现细节看代码:

#include
#include
#include
#include
#include
const int maxn=200010;using namespace std;int n,m,block,cnt;int pt[maxn],st[maxn],k[maxn],belong[maxn];int l[1005],r[1005];void print(int w){ int t=0; do{ t+=st[w]; w=pt[w]; }while(w); printf("%d\n",t);}int main(){ scanf("%d",&n); block=sqrt(n); for(int i=1;i<=n;i++) scanf("%d",&k[i]); if(n%block)cnt=n/block+1; else cnt=n/block;//cnt存的是块的块数 for(int i=1;i<=cnt;i++) { l[i]=(i-1)*block+1; r[i]=i*block; } for(int i=1;i<=n;i++) belong[i]=(i-1)/block+1; for(int i=n;i>=1;i--) { if(i+k[i]>n)st[i]=1; else if(belong[i]==belong[i+k[i]]) st[i]=st[i+k[i]]+1,pt[i]=pt[i+k[i]]; else st[i]=1,pt[i]=i+k[i]; } scanf("%d",&m); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d %d",&a,&b); b++; if(a==1)print(b); else{ scanf("%d",&c); k[b]=c; for(int j=b;j>=l[belong[b]];j--) { if(belong[j]==belong[j+k[j]]) st[j]=st[j+k[j]]+1,pt[j]=pt[j+k[j]]; else st[j]=1,pt[j]=j+k[j]; } } } return 0;}
View Code

 

转载于:https://www.cnblogs.com/JKAI/p/6964446.html

你可能感兴趣的文章
HDOJ1251解题报告【字典树】
查看>>
java 字符串zlib压缩/解压
查看>>
httpclient新旧版本分割点4.3
查看>>
实现小数据量和海量数据的通用分页显示存储过程
查看>>
JPEG文件结构
查看>>
jquery api 笔记(2) 事件 事件对象
查看>>
10.17NOIP模拟赛
查看>>
Opus 和 AAC 声音编码格式
查看>>
探索Split函数第三位参数的用法
查看>>
应用程序无法启动,因为应用程序的并行配置不正确
查看>>
Python单元测试——unittest
查看>>
The document cannot be opened. It has been renamed, deleted or moved.
查看>>
ios中@class和 #import,两种方式的讨论
查看>>
OpenStack,ceph
查看>>
Odoo 8.0 new API 之Environment
查看>>
页面传值中get和post区别
查看>>
PHP-CGI漏洞成因原理剖析和利用
查看>>
20145212 罗天晨 《网络对抗》Exp3 Advanced 恶意代码伪装技术实践
查看>>
访问快科技(驱动之家)某个新闻会自动跳转到web.techtoutiao.win
查看>>
Cisco 的基本配置实例之四----vlan的规划及配置(核心交换机)
查看>>