• 洛谷 P3203 [HNOI2010]弹飞绵羊 分块


    我们只需将序列分成 nsqrt{n}n 块,对于每一个点维护一个 val[i]val[i]val[i]to[i]to[i]to[i],分别代表该点跳到下一个块所需要的代价以及会跳到的节点编号。在查询时,我们最多会跳 nsqrt{n}n 块,修改的时候将节点所在区间暴力修改即可。
    Code:

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn = 2000000 + 3;
    int arr[maxn], n, block, to[maxn], val[maxn], m, belong[maxn];
    struct Data_Structure{
        inline void init(){
            block = sqrt(n);
            for(int i = n;i >= 1; --i) 
            {
                belong[i] = (i - 1) / block + 1;
                to[i] = belong[i + arr[i]] == belong[i] ? to[i + arr[i]] : i + arr[i];
                val[i] = belong[i + arr[i]] == belong[i] ? val[i + arr[i]] + 1 : 1;
            }
        }
        inline int solve(){
            int pos, ans = 0;
            scanf("%d",&pos);
            ++pos;
            while(pos <= n){
                ans += val[pos];
                pos = to[pos];
            }
            return ans;
        }
        inline void update(){
            int pos, data;
            scanf("%d%d",&pos,&data);
            ++pos;
            arr[pos] = data;
            for(int i = min(belong[pos] * block, n); i >= (belong[pos] - 1) * block + 1; --i)
            {
                to[i] = belong[i + arr[i]] == belong[i] ? to[i + arr[i]] : i + arr[i];
                val[i] = belong[i + arr[i]] == belong[i] ? val[i + arr[i]] + 1 : 1;
            }
        }
    }T;
    int main(){
        scanf("%d",&n);
        for(int i = 1;i <= n; ++i) scanf("%d",&arr[i]);
        T.init();
        scanf("%d",&m);
        while(m--)
        {
            int opt;
            scanf("%d",&opt);
            switch(opt)
            {
                case 1:
                {
                    printf("%d
    ", T.solve());
                    break;
                }
                case 2:
                {
                    T.update();
                    break;
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    linux(十一)之初始化文件
    linux(十)配置ssh免密登录实现
    linux(九)之网络基础
    linux(八)linux系统中查找文件二
    oracle 重建分区索引
    java.io.IOException: java.sql.SQLException: ORA-01502: index 'BTO.PK_xxxxx' or partition of such index is in unusable state
    oracle count 大表
    shell for if
    oracle 导出表
    linux date
  • 原文地址:https://www.cnblogs.com/guangheli/p/9845089.html
Copyright © 2020-2023  润新知