zoukankan      html  css  js  c++  java
  • 线段树模板

    单点修改,区间查询
    #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;
    }
    

      

  • 相关阅读:
    【JavaP6大纲】SpringCould篇:什么是微服务
    【JavaP6大纲】SpringCould篇: Spring Boot 和 Spring Cloud,谈谈你对它们的理解?
    【JavaP6大纲】分布式会话篇:集群部署时的分布式 Session 如何实现?
    【JavaP6大纲】SpringCould篇:Spring Cloud 和 Dubbo 有哪些区别?
    【JavaP6大纲】SpringCould篇:服务发现组件 Eureka 的主要调用过程?Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别?
    【JavaP6大纲】SpringCould篇:熔断框架如何做技术选型?选用 Sentinel 还是 Hystrix?
    【JavaP6大纲】SpringCould篇:如何限流?在工作中是怎么做的?说一下具体的实现?
    【JavaP6大纲】SpringCould篇:常用组件底层实现
    【JavaP6大纲】MySQL篇:SQL的整个解析、执行过程原理、SQL行转列?
    如何将百度搜索嵌入到站点中!
  • 原文地址:https://www.cnblogs.com/imzscilovecode/p/8823965.html
Copyright © 2011-2022 走看看