2 条题解

  • 0
    @ 2025-7-7 16:07:40
    using namespace std;
    
    struct Bitree{
    	long long bi[1000010],ibi[1000010];
    	long long n;
    	long long lowbit(long long x){
    		return (x & -x);
    	}
    	void init(long long size){
    		n = size;
    		for(long long i = 0; i <= n; i++){
    			bi[i] = 0;
    			ibi[i]=0;
    		}
    	}
    	void add(long long pos,long long val){
    		long long vb=val;
    		long long vib=val*pos;
    		while(pos <= n){
    			bi[pos] += vb;
    			ibi[pos] += vib;
    			pos += lowbit(pos);
    		}
    	}
    	long long queryb(long long pos){
    		long long ans = 0;
    		while(pos > 0){
    			ans += bi[pos];
    			pos -= lowbit(pos);
    		}
    		return ans;
    	}
    	long long queryib(long long pos){
    		long long ans = 0;
    		while(pos > 0){
    			ans += ibi[pos];
    			pos -= lowbit(pos);
    		}
    		return ans;
    	}
    	long long query(long long pos){
    		return queryb(pos) *(pos+1) -queryib(pos);
    	}
    	long long query(long long l,long long r){
    		return query(r)-query(l-1);
    	}
    };
    Bitree bitree;
    long long a[1000005];
    int main(){ 
    	long long n,m;
    	cin>>n>>m;
    	bitree.init(n);
    	for(long long i=1;i<=n;i++){
    		cin>>a[i];
    		bitree.add(i,a[i]-a[i-1]);
    	}
    	for(long long i=1;i<=m;i++){
    		long long op;
    		cin>>op;
    		if(op==1){
    			long long l,r,v;
    			cin>>l>>r>>v;
    			bitree.add(l,v);
    			bitree.add(r+1,-v);
    		}
    		if(op==2){
    			long long l,r;
    			cin>>l>>r;
    			cout<<bitree.query(l,r)<<'\n';
    		}
    	}
    	return 0; 
    }
    
    ```
    `
    • 0
      @ 2025-7-7 15:46:38
      using namespace std;
      struct Bitree{
      	int tree[500050],n;
      	int lowbits(int x){
      		return x&-x;
      	}
      	void init(int size){
      		n=size;
      		for(int i=0;i<=n;i++) tree[i]=0;
      	}
      	void add(int pos,int val){
      		while(pos<=n){
      			tree[pos]+=val;
      			pos+=lowbits(pos);
      		}
      	}
      	int query(int pos){
      		int ans=0;
      		while(pos>0){
      			ans+=tree[pos];
      			pos-=lowbits(pos);
      		}
      		return ans;
      	}
      	int query(int l,int r){
      		return query(r) - query(l - 1);
      	}
      	
      };
      Bitree  bitree;
      int main(){
      	int n,m;
      	
      	cin>>n>>m;
      	bitree.init(n);
      	for(int i=1;i<=n;i++){
      		int val;
      		cin>>val;
      		bitree.add(i,val);
      	}
      	for(int i=1;i<=m;i++){
      		int op,x,y;
      		cin>>op>>x>>y;
      		if(op==1){
      			bitree.add(x,y);
      		}else{
      			cout<<bitree.query(x,y)<<'\n';
      			
      		}
      	}
      	return 0;
      }`
      • 1

      [模板] 树状数组1 : 单点修改,区间查询

      信息

      ID
      2426
      时间
      1000ms
      内存
      512MiB
      难度
      6
      标签
      递交数
      15
      已通过
      11
      上传者