题目

某天,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】弹飞绵羊的更多相关文章

  1. BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 6801 Solved: 3573 [Submi ...

  2. bzoj2002 弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  3. [Link-Cut-Tree][BZOJ2002]弹飞绵羊

    题面 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上\(n\)个 ...

  4. bzoj2002 弹飞绵羊 lct版

    这道题就是维护一个有根的lct 一开始建树全部建虚边 求多少次弹出就是求他到根的距离(根为n+1) 这里有个小技巧 将n+1作为根而没有虚根操作起来会比较方便 #include<cstdio&g ...

  5. BZOJ2002弹飞绵羊

    动态树LCT模板题 #include<cstdio> #include<cctype> #include<algorithm> using namespace st ...

  6. bzoj2002 弹飞绵羊 分块

    这道题是分块的初尝试 讲给定的区间n进行分块处理 这个每次修改的复杂的只有logn 很方便 代码是学黄学长的 http://hzwer.com/3505.html 当然里面还是有一定我自己的想法在里面 ...

  7. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2843  Solved: 1519[Submi ...

  8. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

    [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...

  9. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

    [BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...

  10. 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊

    BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 Solution 很早以前写的一道分块题,最近在搞LCT,又做了一遍. 1.LCT做法 看到这种动态修改,想下LCT怎么维护. 修改操作就 ...

随机推荐

  1. maven dependency中scope=compile 和 provided区别

    问题再现: 上次这边朋友问我一个问题,就是他们在pom.xml中的dependency中,看到有一些是<scope>provided</scope>的情况,比如如下: < ...

  2. malloc和cmalloc

    void *malloc(size_t size); 分配内存,但不会初始化,未使用内存不一定是0: void *calloc(size_t numElements,size_t sizeOfElem ...

  3. itchat初步解读登录(转)

    原文:https://blog.csdn.net/coder_pig/article/details/81357810 itchat的登录采取的是通过itchat.auto_login()这个函数来完 ...

  4. MySQL学习-数据库设计以及sql的进阶语句

    1.数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power des ...

  5. mysql中关于 like ,not like 的用法时不能显示空值的数据(空值不参与判断,直接过滤空值)

    一般在项目中用法是(这种没办法显示空值的数据): select * from 表 where 字段 like %aaa%; 解决空值不显示(除了显示的数据外,空值数据也可以显示): select * ...

  6. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题

    问题描述: 这个实际上是最后一部的问题,将生成的共享库文件放入到了/usr/local/opencv-arm/lib下,并且设置了LD_LIBRARY_PATH中为/usr/local/opencv- ...

  7. CVE 2019 0708 安装重启之后 可能造成 手动IP地址丢失.

    1. 最近两天发现 更新了微软的CVE 2019-0708的补丁之后 之前设置的手动ip地址会变成 自动获取, 造成ip地址丢失.. 我昨天遇到两个, 今天同事又遇到一个.微软做补丁也不走心啊..

  8. 背包dp相关

    0/1背包 给出n个物品,每个物品有Vi的价值和Wi的费用,我们总共有m块钱,求最多能得到多少价值的物品. N<=10^3,m<=10^3 记录方案数?记录输出方案? 输出方案: 对每个d ...

  9. [LeetCode] 95. 不同的二叉搜索树 II

    题目链接 : https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 题目描述: 给定一个整数 n,生成所有由 1 ... n ...

  10. Redux 关系图解

    Redux是一款状态管理库,并且提供了react-redux库来与React亲密配合, 但是总是傻傻分不清楚这2者提供的API和相应的关系.这篇文章就来理一理. Redux Redux 三大核心 Re ...