有大佬帮我看一看我的板子错哪里了吗,查了几个小时了没看出来
查看原帖
有大佬帮我看一看我的板子错哪里了吗,查了几个小时了没看出来
748250
haoguhao楼主2023/1/11 00:29
#include<bits/stdc++.h>
using namespace std;
int n,m,p,opt,x,y,k;
const int MAXN=1e5+5;
struct node{
	int sum,add,mul,l,r;
}ans[MAXN*4];
int a[MAXN]; 
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
void push_up(int p){ans[p].sum=ans[ls(p)].sum+ans[rs(p)].sum;}
void build(int p,int l,int r){
	ans[p].mul=1;ans[p].add=0;ans[p].l=l;ans[p].r=r;
	if(l==r){ans[p].sum=a[l];return;}
	int mid=(l+r)/2;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
void push_down(int p){
	ans[ls(p)].sum=ans[ls(p)].sum*ans[p].mul+ans[p].add*(ans[ls(p)].r-ans[ls(p)].l+1);
	ans[rs(p)].sum=ans[rs(p)].sum*ans[p].mul+ans[p].add*(ans[rs(p)].r-ans[rs(p)].l+1);
	ans[ls(p)].mul=ans[ls(p)].mul*ans[p].mul;
	ans[rs(p)].mul=ans[rs(p)].mul*ans[p].mul;
	ans[ls(p)].add=ans[ls(p)].add*ans[p].mul+ans[p].add;
	ans[rs(p)].add=ans[rs(p)].add*ans[p].mul+ans[p].add;
	ans[p].mul=1;
	ans[p].add=0;
}
void update(int l,int r,int p,int k){
	if(l<=ans[p].l && ans[p].r<=r){
		ans[p].sum+=(r-l+1)*k;
		ans[p].add+=k;
		return ;
	}
	push_down(p);
	push_up(p);
	int mid=(ans[p].l+ans[p].r)/2;
	if(l<=mid) update(l,r,ls(p),k);
	if(r>mid) update(l,r,rs(p),k);
	push_up(p);
}
void Multiplication(int l,int r,int p,int k){
	if(l<=ans[p].l && ans[p].r<=r){
		ans[p].sum=ans[p].sum*k;
		ans[p].add=ans[p].add*k;
		ans[p].mul=ans[p].mul*k;
		return ;
	}
	push_down(p);
	push_up(p); 
	int mid=(ans[p].l+ans[p].r)/2;
	if(l<=mid) Multiplication(l,r,ls(p),k);
	if(r>mid) Multiplication(l,r,rs(p),k);
	push_up(p);
}
int query(int l,int r,int p){
	if(l<=ans[p].l && ans[p].r<=r) return ans[p].sum;
	push_down(p);
	int res=0;
	int mid=(ans[p].l+ans[p].r)/2;
	if(l<=mid) res+=query(l,r,ls(p));
	if(r>mid) res+=query(l,r,rs(p));
	return res; 
} 
int main(){
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	while(m--){
		scanf("%d",&opt);
		if(opt==1){
			scanf("%d%d%d",&x,&y,&k);
			for(int i=1;i<=9;i++) cout<<ans[i].sum<<' ';
			cout<<endl;
			update(x,y,1,k);
		}
		else if(opt==2){
			scanf("%d%d%d",&x,&y,&k);
			Multiplication(x,y,1,k);
		}
		else{
			scanf("%d%d",&x,&y);
			cout<<query(x,y,1)<<endl;
		}
	}
	return 0; 
} 
2023/1/11 00:29
加载中...