线段树动态开点

//区间加,区间询问
//A Simple Problem with Integers


#include <bits/stdc++.h> #define int long long using namespace std; const int N=1e5+5; int n,m,x,y,v,now,cnt; int a[N],add[N*50],sum[N*50],lson[N*50],rson[N*50]; inline void pushdown(int k,int l,int r,int mid) { if (add[k]) { add[lson[k]]+=add[k]; sum[lson[k]]+=(mid-l+1)*add[k]; add[rson[k]]+=add[k]; sum[rson[k]]+=(r-(mid+1)+1)*add[k]; add[k]=0; } } void build(int k,int l,int r) { if (l==r) {sum[k]=a[l]; return;} if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; build(lson[k],l,mid); build(rson[k],mid+1,r); sum[k]=sum[lson[k]]+sum[rson[k]]; } void change(int k,int l,int r,int qx,int qy,int v) { if (qx<=l && r<=qy) { add[k]+=v; sum[k]+=(r-l+1)*v; return; } if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; pushdown(k,l,r,mid); if (qx<=mid) change(lson[k],l,mid,qx,qy,v); if (mid<qy) change(rson[k],mid+1,r,qx,qy,v); sum[k]=sum[lson[k]]+sum[rson[k]]; } int query(int k,int l,int r,int qx,int qy) { if (qx<=l && r<=qy) return sum[k]; if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; pushdown(k,l,r,mid); int ans=0; if (qx<=mid) ans+=query(lson[k],l,mid,qx,qy); if (mid<y) ans+=query(rson[k],mid+1,r,qx,qy); return ans; } signed main(){ scanf("%lld%lld",&n,&m); cnt=1; for (register int i=1; i<=n; ++i) scanf("%lld",&a[i]); build(1,1,n); for (register int i=1; i<=m; ++i) { char kk; cin>>kk; // scanf("%lld",&now); if (kk=='C') { scanf("%lld%lld%lld",&x,&y,&v); change(1,1,n,x,y,v); } else { scanf("%lld%lld",&x,&y); printf("%lld ",query(1,1,n,x,y)); } } return 0; }

  

//zz https://blog.csdn.net/u012972031/article/details/88751811
//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;
}

  

//区间赋值,区间询问
//https://www.luogu.com.cn/problem/CF915E

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,q,cnt,l,r,v;
int sum[N*50],tag[N*50],lson[N*50],rson[N*50];

inline void pushdown(int k,int l,int r,int mid)
{
	if (~tag[k])
	{
		sum[lson[k]]=(mid-l+1)*tag[k];
		sum[rson[k]]=(r-(mid+1)+1)*tag[k];
		tag[lson[k]]=tag[rson[k]]=tag[k];
		tag[k]=-1;
	}
}

void change(int k,int l,int r,int qx,int qy,int v)
{
	if (qx<=l && r<=qy)
	{ 
		tag[k]=v;
		sum[k]=(r-l+1)*v;
		return;
	}
	if (!lson[k]) lson[k]=++cnt;
	if (!rson[k]) rson[k]=++cnt;
	int mid=l+r>>1;
	pushdown(k,l,r,mid);
	if (qx<=mid) change(lson[k],l,mid,qx,qy,v);
	if (mid<qy) change(rson[k],mid+1,r,qx,qy,v);
	sum[k]=sum[lson[k]]+sum[rson[k]];
}

int main(){
	memset(tag,-1,sizeof(tag));
	scanf("%d",&n);
	scanf("%d",&q);
	cnt=1;
	while (q--)
	{
		scanf("%d%d%d",&l,&r,&v);
		v&=1;
		if (l>r) swap(l,r);
		change(1,1,n,l,r,v);
		printf("%d
",n-sum[1]);
	}
return 0;
}
//https://blog.csdn.net/Dove_xyh/article/details/103019813

  

原文地址:https://www.cnblogs.com/cutemush/p/11833939.html