萌新刚学线段树懒标记,求解
查看原帖
萌新刚学线段树懒标记,求解
349824
WsW_花逝爆零人楼主2021/1/26 14:45
#include<bits/stdc++.h>
struct node{
	int r,l,tag;
	long long sum;
}tree[400000];
int x,y,k,f,a[100004];
int n,m;
int rs(int x){
	return x<<1|1;
}
int ls(int x){
	return x<<1;
}
int fa(int x){
	return x>>1;
}
void pushup(int id){
	tree[id].sum=tree[rs(id)].sum+tree[ls(id)].sum;
}
void pushdown(int id,int r,int l){
	tree[rs(id)].tag=tree[id].tag;
	tree[rs(id)].sum+=tree[id].tag*(tree[rs(id)].r-tree[rs(id)].l+1);
	tree[ls(id)].tag=tree[id].tag;
	tree[ls(id)].sum+=tree[id].tag*(tree[ls(id)].r-tree[ls(id)].l+1);
	tree[id].tag=0;
}
void build(int id,int l,int r){
	tree[id].tag=0;
	tree[id].l=l;
	tree[id].r=r;
	if(l==r){
		tree[id].sum=a[tree[id].l];
		return ;
	}
	build(ls(id),l,(r+l)>>1);
	build(rs(id),((r+l)>>1)+1,r);
	pushup(id);
//	printf("1");
}
void update(int id,int l,int r,int x){
	if(l<=tree[id].l&&r>=tree[id].r){
		tree[id].tag=x;
		tree[id].sum+=x*(tree[id].r-tree[id].l+1);
		return ;
	}
	int m=(tree[id].l+tree[id].r)>>1;
	if(l<=m)update(ls(id),l,(r+l)>>1,x);
	if(r>m)update(rs(id),((r+l)>>1)+1,r,x);
	pushup(id);
}
long long query(int id,int l,int r){
	if(l<=tree[id].l&&r>=tree[id].r)return tree[id].sum;
	int m=(tree[id].l+tree[id].r)>>1;
	pushdown(id,l,r);
	long long ans=0;
	if(l<=m)ans+=(ls(id),l,(r+l)>>1);
	if(r>m)ans+=(rs(id),((r+l)>>1)+1,r);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,n);
	while(m--){
		scanf("%d%d%d",&f,&x,&y);
		if(f==1){
			scanf("%d",&k);
			update(1,x,y,k);
		}
		else printf("%lld\n",query(1,x,y));
	}
	return 0;
}
2021/1/26 14:45
加载中...