分块练习- BZOJ2002-Bounce 弹飞绵羊
来源:互联网 发布:金融职位人数 知乎 编辑:程序博客网 时间:2024/05/16 01:15
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002
我的第一道分块题,因为是先选了莫队之后才做的,所以看别人的代码很快就理解了分块的思想。
我的理解就是
将当前区域分成许多个块(神奇的sqrt(n))每个块内维护自己块内的信息,然后分区处理
以这道题为例子:
题意:有n个装置每个装置可以将你向后ai步,随意询问s起点问最少需要几步弹出(i+ai>n)
做法
1.将n个装置分别分为根号n块,每一个点维护到下一个块的落地位置和最小步数(如果直接弹出落地位置为-1)
维护过程
{
1.如果直接弹出 pos=-1 ,step=1;
2. 如果弹出当前块 pos=i+ai,step=1;
3. 如果没弹出当前块 pos=pos[ i+ai ],step=stet[i +ai]+1
}
2.每次询问时 递归 ans+=这个点到下一个块的步数, 当前点变为落地点即可
3.如果改变装置的ai 只需要逆序维护改变的 块的第一个点到当前点的信息即可
注意:因为这里都是从一个点转移到下一个点,所以应该逆序处理,使下一个点的信息已知!!!
#include <iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<string.h>using namespace std;const int maxn=200100;int pos[maxn],a[maxn],times[maxn];int main(){ int n,m ,unit,k,x,y,ans; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } unit=(int)sqrt(n+1e-7); for(int i=n-1;i>=0;i--) { if(i+a[i]>=n) { pos[i]=-1; times[i]=1; } else if(i+a[i]>=((i/unit)+1)*unit) { pos[i]=i+a[i]; times[i]=1; } else { pos[i]=pos[i+a[i]]; times[i]=times[i+a[i]]+1; } } scanf("%d",&m); for(int tt=1;tt<=m;tt++) { scanf("%d",&k); if(k==1) { scanf("%d",&x); ans=0; while(x!=-1) { ans+=times[x]; x=pos[x]; } printf("%d\n",ans); } else if(k==2) { scanf("%d%d",&x,&y); a[x]=y; for(int i=x;i>=x/unit*unit;i--) { if(i+a[i]>=n) { pos[i]=-1; times[i]=1; } else if(i+a[i]>=((i/unit)+1)*unit) { pos[i]=i+a[i]; times[i]=1; } else { pos[i]=pos[i+a[i]]; times[i]=times[i+a[i]]+1; } } } } return 0;}
0 0
- 分块练习- BZOJ2002-Bounce 弹飞绵羊
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊 (分块)
- 【bzoj2002】【Hnoi2010】【Bounce】【弹飞绵羊】【分块】
- BZOJ2002 Bounce 弹飞绵羊 <分块>
- BZOJ2002(Hnoi2010)[Bounce 弹飞绵羊]--分块
- [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 分块 Link-Cut-Tree
- BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 解题报告【数据结构】【分块】
- bzoj2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
- 【分块】BZOJ2002(Hnoi2010)[Bounce 弹飞绵羊]题解
- bzoj2002 弹飞绵羊【分块】
- [BZOJ2002][Hnoi2010]Bounce 弹飞绵羊 && LCT
- 【动态树】[BZOJ2002] Bounce 弹飞绵羊
- bzoj2002:[Hnoi2010]Bounce 弹飞绵羊
- [BZOJ2002][Hnoi2010]Bounce 弹飞绵羊
- 【HNOI2010】【BZOJ2002】Bounce 弹飞绵羊
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
- 【bzoj2002】 [Hnoi2010]Bounce 弹飞绵羊
- bzoj2002: [Hnoi2010]Bounce 弹飞绵羊
- Geode Region 管理
- R语言plyr包学**
- Sqlserver2000服务器安装配置
- 二叉树常见面试题汇总
- 【网站管理1】_dede织梦后台如何发布文章
- 分块练习- BZOJ2002-Bounce 弹飞绵羊
- java统一异常处理
- PHP知识(一)
- Leetcode学习(42)—— Assign Cookies
- 如何把本地的jar包添加到Maven仓库
- Android Studio 与SVN的关联及使用方法
- 如何看待放弃生活努力赚钱的"阿里人"
- Composer安装和使用
- 学习@浅墨_毛星云的【OpenCV入门教程】之四