• 线段树模板


    单点修改,区间查询
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    
    typedef long long ll;
    
    const int inf = 0x3f3f3f3f;
    const int maxn = 100000+10;
    int n,q;
    int _max[maxn],arr[maxn];
    
    void pushUp(int rt){
    	_max[rt]=max(_max[rt<<1],_max[rt<<1|1]);
    }
    
    void build(int l,int r,int rt){
    	if(l==r){
    		_max[rt]=arr[l];
    		return;
    	}
    	int mid=(l+r)/2;
    	build(l,mid,rt<<1);
    	build(mid+1,r,rt<<1|1);
    	pushUp(rt);
    }
    
    void update(int pos,int val,int l,int r,int rt){
    	if(l==r){
    		_max[rt]=val;
    		return;
    	}
    	int mid=(l+r)/2;
    	if(pos<=mid){
    		update(pos,val,l,mid,rt<<1);
    	}else{
    		update(pos,val,mid+1,r,rt<<1|1);
    	}
    	pushUp(rt);
    }
    
    int query(int L,int R,int l,int r,int rt){
    	if(L<=l&&R>=r){
    		return _max[rt];
    	}
    	int mid=(l+r)/2;
    	int ans=-inf;
    	if(L<=mid){
    		ans=max(ans,query(L,R,l,mid,rt<<1));
    	}
    	if(R>mid){
    		ans=max(ans,query(L,R,mid+1,r,rt<<1|1));
    	}
    	return ans;
    }
    
    int main(){
    	scanf("%d%d",&n,&q);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&arr[i]);
    	}
    	build(1,n,1);
    	char op[5];
    	for(int i=1;i<=q;i++){
    		scanf("%s",op);
    		if(op[0]=='C'){
    			int u,v;
    			scanf("%d%d",&u,&v);
    			update(u,v,1,n,1);
    		}else{
    			int u,v;
    			scanf("%d%d",&u,&v);
    			printf("%d
    ",query(u,v,1,n,1));
    		}
    	}
    	return 0;
    } 
    
    
    
    
    
    
    区间覆盖,区间查询
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    
    typedef long long ll;
    
    const int inf = 0x3f3f3f3f;
    const int maxn = 100000+10;
    
    int n,q;
    int sum[maxn],lazy[maxn],arr[maxn];
    
    void pushUp(int rt){
    	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void pushDown(int rt,int k){
    	if(lazy[rt]){
    		lazy[rt<<1]=lazy[rt];
    		sum[rt<<1]=lazy[rt]*(k-(k>>1));
    		lazy[rt<<1|1]=lazy[rt];
    		sum[rt<<1|1]=lazy[rt]*(k>>1);
    		lazy[rt]=0;
    	}
    }
    void build(int l,int r,int rt){
    	lazy[rt]=0;
    	if(l==r){
    		sum[rt]=arr[l];
    		return;
    	}
    	int mid=(l+r)/2;
    	build(l,mid,rt<<1);
    	build(mid+1,r,rt<<1|1);
    	pushUp(rt);
    }
    void update(int L,int R,int val,int l,int r,int rt){
    	if(L<=l&&R>=r){
    		lazy[rt]=val;
    		sum[rt]=lazy[rt]*(r-l+1);
    		return;
    	}
    	pushDown(rt,r-l+1);
    	int mid=(l+r)/2;
    	if(L<=mid){
    		update(L,R,val,l,mid,rt<<1);
    	}
    	if(R>mid){
    		update(L,R,val,mid+1,r,rt<<1|1);
    	}
    	pushUp(rt);
    }
    int query(int L,int R,int l,int r,int rt){
    	if(L<=l&&R>=r){
    		return sum[rt];
    	}
    	pushDown(rt,r-l+1);
    	int mid=(l+r)/2;
    	int ans=0;
    	if(L<=mid){
    		ans+=query(L,R,l,mid,rt<<1);
    	}
    	if(R>mid){
    		ans+=query(L,R,mid+1,r,rt<<1|1);
    	}
    	return ans;
    }
    int main(){
    	scanf("%d%d",&n,&q);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&arr[i]);
    	}
    	build(1,n,1);
    	char op[5];
    	for(int i=1;i<=q;i++){
    		scanf("%s",op);
    		if(op[0]=='Q'){
    			int u,v;
    			scanf("%d%d",&u,&v);
    			printf("%d
    ",query(u,v,1,n,1));
    		}else{
    			int u,v,w;
    			scanf("%d%d%d",&u,&v,&w);
    			update(u,v,w,1,n,1);
    		}
    	} 
    	return 0;
    }
    
    
    
    区间修改,区间查询
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    
    typedef long long ll;
    
    const int inf = 0x3f3f3f3f;
    const int maxn = 100000+10;
    
    int n,q;
    int sum[maxn],lazy[maxn],arr[maxn];
    
    void pushUp(int rt){
    	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void pushDown(int rt,int k){
    	if(lazy[rt]){
    		lazy[rt<<1]+=lazy[rt];
    		sum[rt<<1]+=lazy[rt]*(k-(k>>1));
    		lazy[rt<<1|1]+=lazy[rt];
    		sum[rt<<1|1]+=lazy[rt]*(k>>1);
    		lazy[rt]=0;
    	}
    }
    void build(int l,int r,int rt){
    	lazy[rt]=0;
    	if(l==r){
    		sum[rt]=arr[l];
    		return;
    	}
    	int mid=(l+r)/2;
    	build(l,mid,rt<<1);
    	build(mid+1,r,rt<<1|1);
    	pushUp(rt);
    }
    void update(int L,int R,int val,int l,int r,int rt){
    	if(L<=l&&R>=r){
    		lazy[rt]+=val;
    		sum[rt]+=val*(r-l+1);
    		return;
    	}
    	pushDown(rt,r-l+1);
    	int mid=(l+r)/2;
    	if(L<=mid){
    		update(L,R,val,l,mid,rt<<1);
    	}
    	if(R>mid){
    		update(L,R,val,mid+1,r,rt<<1|1);
    	}
    	pushUp(rt);
    }
    int query(int L,int R,int l,int r,int rt){
    	if(L<=l&&R>=r){
    		return sum[rt];
    	}
    	pushDown(rt,r-l+1);
    	int mid=(l+r)/2;
    	int ans=0;
    	if(L<=mid){
    		ans+=query(L,R,l,mid,rt<<1);
    	}
    	if(R>mid){
    		ans+=query(L,R,mid+1,r,rt<<1|1);
    	}
    	return ans;
    }
    int main(){
    	scanf("%d%d",&n,&q);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&arr[i]);
    	}
    	build(1,n,1);
    	char op[5];
    	for(int i=1;i<=q;i++){
    		scanf("%s",op);
    		if(op[0]=='Q'){
    			int u,v;
    			scanf("%d%d",&u,&v);
    			printf("%d
    ",query(u,v,1,n,1));
    		}else{
    			int u,v,w;
    			scanf("%d%d%d",&u,&v,&w);
    			update(u,v,w,1,n,1);
    		}
    	} 
    	return 0;
    }
    

      

  • 相关阅读:
    CDN与缓存的归纳理解
    CSRF介绍与应对以及Java代码示例
    java严格验证日期是否正确的代码
    consul(一)什么是consul
    服务发现--初识Consul
    Consul 快速入门
    spring cloud: 使用consul来替换eureka
    Eureka&Zookeeper&Consul 原理与对比
    服务发现框架选型,Consul还是Zookeeper还是etcd
    腾讯运维10年,我斩获了这5把“杀手锏”
  • 原文地址:https://www.cnblogs.com/imzscilovecode/p/8823965.html
Copyright © 2020-2023  润新知