• 【Hnoi2010】Bzoj2002 Bounce & Codevs2333 弹飞绵羊


    Position:


    Description

    • 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

    Input

    • 第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000

    Output

    • 对于每个i=1的情况,你都要输出一个需要的步数,占一行。

    Sample Input

    4
    1 2 1 1
    3
    1 1
    2 1 1
    1 1

    Sample Output

    2
    3

    Solution

    坑那~这题下标从零开始(异世界生活)
    采用分块算法。对于每一点记录跳多少步可以跳出当前块,并且会跳到下一(几)块的哪个,update:c[x]=c[a[x]+x]+1(每次更新时只要更新当前块的第一个点到这个点的值,因为这个点的修改不会的其他块和后面的块造成影响);src:只要跳块就行了.
    复杂度:O(m*sqrt(n))

    Code

    // <Bounce.cpp> - 08/19/16 17:15:29
    // This file is made by YJinpeng,created by XuYike's black technology automatically.
    // Copyright (C) 2016 ChangJun High School, Inc.
    // I don't know what this program is.
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #define MOD 1000000007
    #define INF 1e9
    #define EPS 1e-10
    using namespace std;
    typedef long long LL;
    const int MAXN=200010;
    const int MAXM=100010;
    inline int max(int &x,int &y) {return x>y?x:y;}
    inline int min(int &x,int &y) {return x<y?x:y;}
    inline int getint() {
    	register int w=0,q=0;register char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')q=1,ch=getchar();
    	while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
    	return q?-w:w;
    }
    int n,m,num,type,now,ans,p,to;
    int a[MAXN],pos[MAXN],b[MAXN],c[MAXN];
    inline int update(int x){
        if(a[x]+x>min(n,pos[x]*num-1)){c[x]=1;return a[x]+x;}
        c[x]=c[a[x]+x]+1;return b[a[x]+x];
    }
    int main()
    {
    	freopen("Bounce.in","r",stdin);
    	freopen("Bounce.out","w",stdout);
    	n=getint()-1;num=(int)sqrt(n+1);
        for(int i=0;i<=n;i++)a[i]=getint();
        for(int i=0;i<=n;i++)pos[i]=(i/num)+1;
        for(int i=n;i>=0;i--)b[i]=update(i);
        m=getint();
        while(m--){
            type=getint();
            if(type==1){
                now=getint();ans=0;
                while(now<=n)
                    ans+=c[now],now=b[now];
                printf("%d
    ",ans);
                continue;
            }
            p=getint();a[p]=getint();to=(pos[p]-1)*num;
            for(int i=p;i>=to;i--)b[i]=update(i);
        }
        return 0;
    }
    
  • 相关阅读:
    laravel进阶知识大纲
    spring boot 配置多个DispatcherServlet
    RepeatReadRequestWrapper
    RestTemplate HttpClient详解及如何设置忽略SSL
    Swagger注解-@ApiModel 和 @ApiModelProperty
    SpringBoot 接收 单个String入参之解决方案
    spring boot添加 LocalDateTime 等 java8 时间类序列化和反序列化的支持
    Mybatisplus实现MetaObjectHandler接口自动更新创建时间更新时间
    关于SpringBoot 2.0,Pageable 无法注入,提示缺少默认构造方法的解决办法
    OP_REQUIRES failed at save_restore_v2_ops.cc:109 : Permission denied: model/variables/variables_t emp; Permission denied
  • 原文地址:https://www.cnblogs.com/YJinpeng/p/5907459.html
Copyright © 2020-2023  润新知