• 线段树进行区间乘与区间加,区间求和


    对于此类问题,维护时要先乘后加,不管是对于lazy下传还是将lazy加到和中。
    特殊的:

    void D(int rt,int l,int r,int mid){//push down
    	w[L]=(w[L]*lc[rt]%M+lazy[rt]*(mid-l+1)%M)%M;
    	w[R]=(w[R]*lc[rt]%M+lazy[rt]*(r-mid)%M)%M;
    	lazy[L]=(lazy[L]*lc[rt]%M+lazy[rt])%M;
    	lazy[R]=(lazy[R]*lc[rt]%M+lazy[rt])%M;
    	(lc[L]*=lc[rt])%=M;
    	(lc[R]*=lc[rt])%=M;
    	lazy[rt]=0;lc[rt]=1;//前面初始化时lazy就是0,lc是1
    }
    
    void MC(int rt,int l,int r,int a,int b,int x){//维护区间乘
    	if(a<=l&&r<=b){
    		(lazy[rt]*=x)%=M;
    		(lc[rt]*=x)%=M;
    		(w[rt]*=x)%=M;
    		return;
    	}
    	int mid=(l+r)>>1;
    	D(rt,l,r,mid);
    	if(a<=mid)MC(L,l,mid,a,b,x);
    	if(b >mid)MC(R,mid+1,r,a,b,x);
    	UP(rt);
    }
    
  • 相关阅读:
    ElasticSearch-生命周期管理
    Alpha 冲刺五
    Alpha 冲刺四
    Alpha 冲刺三
    Alpha 冲刺二
    Alpha 冲刺一
    测试随笔
    校友录
    项目需求分析(淘校)
    团队选题报告(淘校)
  • 原文地址:https://www.cnblogs.com/Lour688/p/13301344.html
Copyright © 2020-2023  润新知