zoukankan      html  css  js  c++  java
  • 树状数组:区间修改,单点查询(详解)

    我已经在上一篇博客 《树状数组:单点修改,区间查询(详解)》中介绍了树状数组,并且讲解了一道例题。今天就再来看一道题:

    题目描述

    给定数列 ,你需要依次进行 q个操作,操作有两类:
    1 l r x:给定 ,对于所有 ,将  加上 (换言之,将  分别加上 );
    2 i:给定 ,求  的值。
    输入格式:
    第一行包含 2 个正整数 ,表示数列长度和询问个数。
    第二行 n个整数 ,表示初始数列。
    接下来 q 行,每行一个操作,为以下两种之一:
    1 l r x:对于所有 ,将 a[r] 加上 x ;
    2 i  :给定 i,求 a[i]  的值。
    

    输出格式

    对于每个 2 i 操作,输出一行,每行有一个整数,表示所求的结果。
    

    样例输入

    3 2
    1 2 3
    1 1 3 0
    2 2
    

    样例输出

    2
    

    这道题和上一道恰恰相反。我们在这一题,可以使用差分数组的思想。在输入的时候就把差分数组输入到树上。我们根据差分数组的性质可以得知,a[i] = pre[1] + pre[2] + ··· pre[i],所以就与上一题一样,用 O(logn2) 的算法求出a[i]。而修改单点的时候,我们可以根据差分数组的性质的来:若要将一个区间(l~r)的数都加上 x ,那么则只需要在 a[l] 的地方加上一个 x, a[r + 1] 的地方减去一个 x 就可以了。所以可以解决这道题:

    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 1e6 + 5;
    long long bit[MAXN];
    int a[MAXN];
    int n, m;
    
    int Lowbit (int x) {
    	return x & (-x);
    } 
    
    void Update (int x, int num) {
    	for (int i = x; i <= n; i += Lowbit(i)) {
    		bit[i] += num;
    	}
    }
    
    long long Sum (int x) {
    	long long sum_ = 0;
    	for (int i = x; i >= 1; i -= Lowbit(i)) {
    		sum_ += bit[i];
    	}
    	return sum_;
    }//与上篇文章所述一样
    
    int main() {
    	scanf("%d %d", &n, &m);
    	for (int i = 1; i <= n; i++) {
    		scanf("%d", &a[i]);
    		Update(i, a[i] - a[i - 1]);//做一个差分
    	}
    	for (int i = 1; i <= m; i++) {
    		int check, l, r, num, index;
    		scanf("%d", &check);
    		if (check == 1) {
    			scanf("%d %d %d", &l, &r, &num);
    			Update(l, num);//先把 l 加上 num
    			Update(r + 1, -num);//还原后面不用修改的
    		}
    		else {
    			scanf("%d", &index);
    			printf("%lld
    ", Sum(index));//通过差分数组的公式来求出要求第 index 项
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Object: Date对象——时间的设置和返回
    CSS基础知识-常用属性(updating)
    图像
    一些基础名词及含义(更新中)
    HTML常用元素合集(更新中)
    HTML小贴士-tips1
    HTML&CSS基础(一):基本格式(更新中)
    vue 轮播图显示三张图片,图片居中显示
    移动端 rem自适应布局 (750的设计稿)
    vue axios 在ios 中不执行回调(vconsole中status为0)
  • 原文地址:https://www.cnblogs.com/cqbzyanglin/p/13509280.html
Copyright © 2011-2022 走看看