• HYSBZ 2002 Bounce 弹飞绵羊(分块)


    今天原来打算做ZOJ月赛的,等到中午的时候感觉太困了,就睡了一觉,然后就没有然后了。。。

    这题正版写法应该是LCT,但是分块也能过,而且写起来特别简单,LCT写的话应该是一个Cut,Link操作,维护的就是答案的值(没写)。

    下面附上代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #define LL long long
    #define FOR(i,x,y)  for(int i = x;i < y;i ++)
    #define IFOR(i,x,y) for(int i = x;i > y;i --)
    #define MAXN 220000
    
    using namespace std;
    
    int n,m,ct[MAXN],nt[MAXN],val[MAXN];
    int blocks;
    
    void Modify(int u,int v){
        nt[u] = v;
        ct[u] = 1;
        if(v >= n)  return;
        if(u/blocks == v/blocks){
            ct[u] += ct[v];
            nt[u] = nt[v];
        }
    }
    
    int Query(int x){
        int ans = 0;
        while(x < n){
            ans += ct[x];
            x = nt[x];
        }
        return ans;
    }
    
    int main()
    {
        //freopen("test.in","r",stdin);
        while(~scanf("%d",&n)){
            FOR(i,0,n)  scanf("%d",&val[i]);
            blocks = (int)sqrt(n+0.5) + 1;
            IFOR(i,n-1,-1){
                Modify(i,i+val[i]);
            }
            scanf("%d",&m);
            FOR(i,0,m){
                int op;
                scanf("%d",&op);
                if(op == 1){
                    int x;
                    scanf("%d",&x);
                    printf("%d
    ",Query(x));
                }
                else{
                    int x,w;
                    scanf("%d%d",&x,&w);
                    val[x] = w;
                    int u = x/blocks*blocks;
                    IFOR(i,x,u-1){
                        Modify(i,i + val[i]);
                    }
                }
            }
        }
        return 0;
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    颜色渐变
    DELPHI 反射机制
    网络的收藏资料
    WM_Paint 消息详解
    解决EmbeddedWB弹出页面错误框的问题
    刁蛮公主第二集(纳米盘)
    第五章 用用户控件创建自定义控件
    RTX51 tiny系统要注意的问题:(关于时间片)
    第四章 高级控件编程
    CSDN新频道visual studio技术频道
  • 原文地址:https://www.cnblogs.com/hqwhqwhq/p/4811877.html
Copyright © 2020-2023  润新知