zoukankan      html  css  js  c++  java
  • LOJ6277. 数列分块入门 1 题解

    题目链接:https://loj.ac/p/6277

    涉及操作:

    1. 区间更新;
    2. 单点查询。

    解题思路:

    数列分块。

    • a[i] 表示:第i个数自己存储的值
    • block 表示每个分块的最大尺寸
    • belong[i] 表示:第i个数所属的分块
    • tag[i] 表示:第i个分块的累加值

    示例程序:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 50050;
    /**
        a[i] 表示:第i个数自己存储的值
        block: 表示每个分块的最大尺寸
        belong[i] 表示:第i个数所属的分块
        tag[i] 表示:第i个分块的累加值
    */
    int n, block, a[maxn], belong[maxn], tag[maxn];
    
    void add(int l, int r, int val) {   // 将 [l,r] 都加val
        for (int i = l; i <= min(belong[l]*block, r); i ++)
            a[i] += val;
        if (belong[l] != belong[r])
            for (int i = (belong[r]-1)*block+1; i <= r; i ++)
                a[i] += val;
        for (int i = belong[l]+1; i < belong[r]; i ++)
            tag[i] += val;
    }
    
    int main() {
        ios::sync_with_stdio(0);
        cin >> n;
        block = sqrt(n);
        for (int i = 1; i <= n; i ++) {
            cin >> a[i];
            belong[i] = (i - 1) / block + 1;
        }
        for (int i = 0; i < n; i ++) {
            int op, l, r, c;
            cin >> op >> l >> r >> c;
            if (op == 0) {  // 将[l,r]都加c
                add(l, r, c);
            }
            else {  // 询问 a[r] 的值
                cout << a[r] + tag[belong[r]] << endl;
            }
        }
        return 0;
    }
    

    学习资料:http://hzwer.com/8053.html

  • 相关阅读:
    【NOIP2017】蚯蚓
    【CF407B】Long Path
    【NOIP2017】奶酪
    【NOIP2018】赛道修建(正解)
    【NOIP2018】旅行
    【SDOI2010】地精部落
    【NOIP2017】逛公园
    百度云网盘进行注销操作
    百度超级会员租借.我租给你。
    如何在dos中运行java中的jar包
  • 原文地址:https://www.cnblogs.com/quanjun/p/15524293.html
Copyright © 2011-2022 走看看