【bzoj2002】弹飞绵羊
题目
某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。
分析
这道题大致分为两种方法:动态树和分块。
因为我只是个小渣渣,只会分块做法。
首先把这n个装置分成\(\sqrt{n}\)个块,每个块\(\sqrt{n}\)个装置,这里不多说,分块的基础。
首先我们预处理出从每个点跳出自己属于的块,主要这里要用\(O(n)\)来处理,不可以用\(O(n\sqrt{n})\),否则会超时。
O(n)预处理
for(int i=n-1;i>=0;i--)
{
if(belong[a[i]+i]!=belong[i])
{
fly[i][0]=1;
fly[i][1]=a[i]+i;
}
else
{
fly[i][0]=fly[a[i]+i][0]+1;
fly[i][1]=fly[a[i]+i][1];
}
}
剩下就简单了,
当修改某个点时,将它所在的块中,将它前面的可以飞到它的点修改。
查询就直接一块一块地往后飞就可以了。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=200005;
using namespace std;
int part[500][2],tot,size,n,m,a[N],belong[N],fly[N][2],j,ans;
int preblock()
{
size=sqrt(n);
for(int i=0;i<=n-1;i+=size)
{
part[++tot][0]=i;
if(i+size-1>n-1)
part[tot][1]=n-1;
else
part[tot][1]=i+size-1;
}
for(int i=1;i<=tot;i++)
for(int j=part[i][0];j<=part[i][1];j++)
belong[j]=i;
}
int main()
{
scanf("%d",&n);
preblock();
int x,y,z;
for(int i=0;i<=n-1;i++)
scanf("%d",&a[i]);
for(int i=n-1;i>=0;i--)
{
if(belong[a[i]+i]!=belong[i])
{
fly[i][0]=1;
fly[i][1]=a[i]+i;
}
else
{
fly[i][0]=fly[a[i]+i][0]+1;
fly[i][1]=fly[a[i]+i][1];
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x==2)
{
scanf("%d",&z);
a[y]=z;
for(j=y;j>=part[belong[y]][0];j--)
{
if(belong[a[j]+j]!=belong[j])
{
fly[j][0]=1;
fly[j][1]=a[j]+j;
}
else
{
fly[j][0]=fly[a[j]+j][0]+1;
fly[j][1]=fly[a[j]+j][1];
}
}
}
else
{
ans=0;
while(y<=n-1)
{
ans+=fly[y][0];
y=fly[y][1];
}
printf("%d\n",ans);
}
}
}
【bzoj2002】弹飞绵羊的更多相关文章
- BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 6801 Solved: 3573 [Submi ...
- bzoj2002 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [Link-Cut-Tree][BZOJ2002]弹飞绵羊
题面 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上\(n\)个 ...
- bzoj2002 弹飞绵羊 lct版
这道题就是维护一个有根的lct 一开始建树全部建虚边 求多少次弹出就是求他到根的距离(根为n+1) 这里有个小技巧 将n+1作为根而没有虚根操作起来会比较方便 #include<cstdio&g ...
- BZOJ2002弹飞绵羊
动态树LCT模板题 #include<cstdio> #include<cctype> #include<algorithm> using namespace st ...
- bzoj2002 弹飞绵羊 分块
这道题是分块的初尝试 讲给定的区间n进行分块处理 这个每次修改的复杂的只有logn 很方便 代码是学黄学长的 http://hzwer.com/3505.html 当然里面还是有一定我自己的想法在里面 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2843 Solved: 1519[Submi ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
- 【BZOJ2002】弹飞绵羊(Link-Cut Tree)
[BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...
- 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊
BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 Solution 很早以前写的一道分块题,最近在搞LCT,又做了一遍. 1.LCT做法 看到这种动态修改,想下LCT怎么维护. 修改操作就 ...
随机推荐
- Delphi Tokyo 10.2.3发布了
Delphi Tokyo 10.2.3发布了 http://blog.sina.com.cn/s/blog_44fa172f0102wwwg.html (2018-03-14 07:51:32) 转载 ...
- linux防火墙iptables简单介绍
--append -A chain Append to chain --delete -D chain Delete matching rule from chain ...
- springMVC+Spring+Mybatis+Redis
SPRINGMVC+MYBATIS+SPRING+REDIS 只作参考,以防忘记使用! mybatis的配置文件: <?xml version="1.0" encoding= ...
- 【Linux开发】【Qt开发】交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
一. 什么是ABI和EABI1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)在计算机中,应用 ...
- spring -boot定时任务 quartz 基于 JobDetailFactoryBean实现
这个有点小问题 尚未解决 后期优化 基于 JobDetailFactoryBean实现 依赖包 <dependencies> <dependency> <groupId ...
- spring cloud gateway自定义过滤器
在API网关spring cloud gateway和负载均衡框架ribbon实战文章中,主要实现网关与负载均衡等基本功能,详见代码.本节内容将继续围绕此代码展开,主要讲解spring cloud g ...
- 列表、元组和range
小知识点 s = " 5 " print(int(s)) print(s.replace(" ","")) 结果: 5 5 id()#获取对 ...
- 剑指offer-对称二叉树-树-python
题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. # -*- coding:utf-8 -*- # class TreeNo ...
- gorpeln的个人博客 - gorpeln
2019-10-18 App Store 审核指南 2019-10-03 锚点跳转距离顶部指定距离 2019-09-23 Jekyll 简单加密 (pwd=123456) 2019- ...
- scala学习笔记(8)文件和正则表达式
1.读取行 ---------------------------------------- 要读取文件中所有的行,可以调用scala.io.Source对象的getLine方法: import sc ...