zoukankan      html  css  js  c++  java
  • P3372 【模板】线段树 1

    P3372 【模板】线段树 1

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N=1e5+10;
    ll a[N];
    struct Node{
    	ll it;
    	ll l;
    	ll r;
    	ll data;
    }tree[N<<2];
    ll n,m;
    void build(ll rt,ll l,ll r){
    	tree[rt].l = l;
    	tree[rt].r = r;
    	tree[rt].it = 0;
    	if(l == r) {
    		tree[rt].data = a[l];
    		return ;
    	}
    	ll mid = (l + r)>>1;
    	build(rt*2,l,mid);
    	build(rt*2+1,mid+1,r);
    	tree[rt].data = tree[rt*2].data+tree[rt*2+1].data;
    	return ;
    }
    void push_down(ll rt){
    	if(tree[rt].it!=0){
    		tree[rt*2].it+=tree[rt].it;
    		tree[rt*2+1].it+=tree[rt].it;
    		ll mid = (tree[rt].l+tree[rt].r)>>1;
    		tree[rt*2].data+=tree[rt].it*(mid-tree[rt*2].l+1);
    		tree[rt*2+1].data+=tree[rt].it*(tree[rt*2+1].r-mid);
    		tree[rt].it=0;
    	}
    	return ;
    }
    
    void up_data(ll rt,ll l,ll r,ll k){
    	if(tree[rt].l>=l&&tree[rt].r<=r){
    		tree[rt].data+=k*(tree[rt].r-tree[rt].l+1);
    		tree[rt].it+=k;
    		return ;
    	}
    	push_down(rt);
    	if(tree[rt*2].r>=l){
    		up_data(rt*2,l,r,k);
    	}
    	if(tree[rt*2+1].l<=r){
    		up_data(rt*2+1,l,r,k);
    	}
    	tree[rt].data = tree[rt*2].data + tree[rt*2+1].data;
    	return ;
    }
    
    
    
    ll search(ll rt,ll l,ll r){
    	if(tree[rt].l>=l&&tree[rt].r<=r){
    		return tree[rt].data;
    	}
    	push_down(rt);
    	ll num=0;
    	if(tree[rt*2].r>=l){
    		num+=search(rt*2,l,r);
    	}
    	if(tree[rt*2+1].l<=r){
    		num+=search(rt*2+1,l,r);
    	}
    	return num;
    }
    
    int main(){
    	scanf("%lld%lld",&n,&m);
    	for(ll i=1;i<=n;i++){
    		scanf("%lld",&a[i]);
    	}
    	build(1,1,n);
    	for(ll i = 1;i <= m;i++){
    		ll go;
    		scanf("%lld",&go);
    		if(go == 1){
    			ll x,y,k;
    			scanf("%lld%lld%lld",&x,&y,&k);
    			up_data(1,x,y,k);
    		}
    		if(go == 2){
    			ll x,y;
    			scanf("%lld%lld",&x,&y);
    			printf("%lld
    ",search(1,x,y));
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    关于android listview去掉分割线
    关于android在Service中弹出Dialog对话框
    Java SimpleDateFormat 函数
    关于Android使TextView可以滚动的设置
    关于Android(Java)创建匿名线程
    关于解决 Failed to prepare partial IU:
    毕业设计进度:2月4日
    毕业设计进度:2月3日
    毕业设计进度:2月2日
    毕业设计进度:2月1日
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13204727.html
Copyright © 2011-2022 走看看