• 树状数组2


    树状数组 = O(logn) 单点修改 ,O(logn) 区间查询

    如果要做到 区间修改 单点查询 我们就要加入差分的思想

    用树状数组记录数组的差分 然后对差分进行前缀和就可以得到单点的数据

    //ios::sync_with_stdio(false); 
    #include<bits/stdc++.h> 
    #define ll long long
    using namespace std;
    const int MAXN = 500010;
    int n,m;
    ll C[MAXN]; 
    ll lowbit(ll x)
    {
    	return x&-x;
    }
    void add(ll i,ll val)
    {
    	while(i<=n){
    		C[i]+=val;
    		i +=lowbit(i);
    	}
    }
    ll sum(ll i)
    {
    	ll s = 0;
    	while(i>0){
    		s+=C[i];
    		i-=lowbit(i);
    	}
    	return s;
    } 
    
    int main(){
    	cin >> n >> m;
    	ll l,r,op,k;
    	ll now = 0;
    	for(int i=1;i<=n;++i){
    		cin >> k;
    		add(i,k-now);
    		now = k;
    	}//初始化记录差分数组
    	for(int i=0;i<m;++i){
    		cin >> op ;
    		if(op==1){
    			cin >> l >> r >> k;
    			add(l,k);
    			add(r+1,-k); //区间修改
    		}
    		else{
    			cin >> k;
    			cout << sum(k) <<endl;	//单点查询
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    SASS教程sass超详细教程
    浅谈angular2+ionic2
    深入理解JSON对象
    浅谈闭包
    响应式开发入门
    CSS之float属性归纳探讨
    新学期加油
    Good moring!
    async await的前世今生
    ASP.NET配置KindEditor文本编辑器-图文实例
  • 原文地址:https://www.cnblogs.com/xxrlz/p/10392823.html
Copyright © 2020-2023  润新知