• 线段树动态开点


    //区间加,区间询问
    //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
    

      

  • 相关阅读:
    <context-param>与<init-param>的区别与作用(转自青春乐园)(
    使用Derby ij客户端工具
    转载 Ofbiz 入门教程
    数据库中插入和读取图片
    事务的使用
    存储过程
    触发器 的使用
    JS面试题及答案
    课程主页面三个接口开发
    增加media文件配置
  • 原文地址:https://www.cnblogs.com/cutemush/p/11833939.html
Copyright © 2020-2023  润新知