zoukankan      html  css  js  c++  java
  • 动态开点线段树

     前置知识:

    • 线段树是一种支持O(logn)区间操作的数据结构
    • 具体支持的操作:区间增加/减少/乘以 某个值;查询区间总和(复杂度均为O(logn))

    联系:

    • 主席树需要使用动态开点的思想,而在其他题目中也很常用动态开点线段树而不是普通线段树.

    模板:https://www.luogu.org/problemnew/show/P3372


    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int N=300010;
    struct node{
    	int ls,rs,lazy;
    	long long sum;
    }tr[N];
    int root=0,cnt=0;
    void insert(int &root,int l,int r,int ll,int rr,int x){
    	if(!root)root=++cnt;
    	int b=min(r,rr)-max(l,ll)+1;
    	tr[root].sum+=b*x;
    	if(l>=ll&&r<=rr){
    		tr[root].lazy+=x;
    		return;
    	}
    	int mid=l+r>>1;
    	if(ll<=mid)insert(tr[root].ls,l,mid,ll,rr,x);
    	if(rr>mid)insert(tr[root].rs,mid+1,r,ll,rr,x);
    } 
    long long query(int root,int l,int r,int ll,int rr){
    	if(l>=ll&&r<=rr)return tr[root].sum;
    	int mid=l+r>>1;
    	if(tr[root].lazy){
    		if(!tr[root].ls)tr[root].ls=++cnt;
    		tr[tr[root].ls].lazy+=tr[root].lazy;
    		tr[tr[root].ls].sum+=tr[root].lazy*(mid-l+1);
    		if(!tr[root].rs)tr[root].rs=++cnt;
    		tr[tr[root].rs].lazy+=tr[root].lazy;
    		tr[tr[root].rs].sum+=tr[root].lazy*(r-mid);
    		tr[root].lazy=0;
    	}
    	long long ans=0;
    	if(ll<=mid)ans+=query(tr[root].ls,l,mid,ll,rr);
    	if(rr>mid)ans+=query(tr[root].rs,mid+1,r,ll,rr);
    	return ans;
    }
    int main(){
    	int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            int temp;
            cin>>temp;
            insert(root,1,n,i,i,temp);
        }
        for(int i=1;i<=m;i++){
            int ta,tb,tc,td;
            cin>>ta>>tb>>tc;
            if(ta==1){
                cin>>td;
                insert(root,1,n,tb,tc,td);
            }else if(ta==2){
                cout<<query(root,1,n,tb,tc)<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    pyqt 过滤事件
    python 编码问题
    xpath使用
    BeautifulSoup
    webpack.config.js 大概架构(3)
    图片,html,和其他的打包(2)
    今天开始第一篇
    第一次面试前端,记录下
    阻止默认事件和冒泡
    cookit localStorage sessionStorage 区别
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680654.html
Copyright © 2011-2022 走看看