zoukankan      html  css  js  c++  java
  • bzoj 2002

    2002: [Hnoi2010]Bounce 弹飞绵羊

    Time Limit: 10 Sec  Memory Limit: 259 MB
    Submit: 12203  Solved: 6162
    [Submit][Status][Discuss]

    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

    HINT

     

    Source

    代码:

    //维护每个点跳出他所在的块需要的次数val以及跳到下一个块的哪个点上nex ,更新x点时更新x点和x点所在的块的在x前面的点的val和nex ,查询
    //就很简单了
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    const int MAXN=210009;
    int n,B,cnt,k[MAXN],be[MAXN],val[MAXN],nex[MAXN];
    void build()
    {
        for(int i=n;i>=1;i--){
            int j=i+k[i];
            if(be[i]!=be[j]) { val[i]=1;nex[i]=j; }
            else { val[i]=val[j]+1;nex[i]=nex[j]; }
        }
    }
    void update(int x,int y)
    {
        k[x]=y;
        for(int i=be[x]*B;i>=(be[x]-1)*B+1;i--){
            int j=i+k[i];
            if(j<=be[x]*B) { val[i]=val[j]+1;nex[i]=nex[j]; }
            else { val[i]=1;nex[i]=j; }
        }
    }
    int query(int x)
    {
        int s=0;
        while(x<=n){
            s+=val[x];
            x=nex[x];
        }
        return s;
    }
    int main()
    {
        scanf("%d",&n);
        B=sqrt(n);
        cnt=n/B+(n%B!=0);
        for(int i=1;i<=n;i++){
            scanf("%d",&k[i]);
            be[i]=(i-1)/B+1;
        }
        build();
        int q,op,x,y;
        scanf("%d",&q);
        while(q--){
            scanf("%d",&op);
            if(op==1){
                scanf("%d",&x);x++;
                printf("%d
    ",query(x));
            }else{
                scanf("%d%d",&x,&y);x++;
                update(x,y);
            }
        }
        return 0;
    }
  • 相关阅读:
    construction of tuples containing 0 or 1 items
    globals()
    __new__
    ubuntu系统安装mysql登陆提示 解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'问题
    ubuntu系统更新源
    Python Web开发问题收集(二)
    linux后台执行./run.py提示python syntax error near unexpected token `('
    linux下执行scrapy的爬虫定时任务
    ubuntu系统中crontab的使用介绍
    JMeter BeanShell断言使用
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/7895077.html
Copyright © 2011-2022 走看看