zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
    epoll 事件之 EPOLLRDHUP
    c What is the Difference Between read() and recv() , and Between send() and write()? Stack Overflow
    HTTP KeepAlive详解 IT心雪的日志 网易博客
    北京生活 TIPS 银行服务篇
    eventfdaiotest.c
    北京生活 TIPS 谈谈日常理财
    C语言抓http gzip包并解压 失败 C/C++ ChinaUnix.net
    转:javascript 对象和原型
    转:Javascript原型链和原型的一个误区
  • 原文地址:https://www.cnblogs.com/YJinpeng/p/5907459.html
Copyright © 2011-2022 走看看