跑不起来求调
查看原帖
跑不起来求调
1349423
jms23002楼主2025/1/18 19:00
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,a[N];
struct node{
	int l;
	int r;
	int sum;
	int lazy;//建树,lr左右端点,sum区间和,lazy标记 
}tr[4*N];
void pushup(int u){//标记上传 
	tr[u].sum=tr[u*2].sum+tr[u*2+1].sum;
}
void pushdown(int u){//标记下传 
	if(tr[u].lazy){
		tr[u*2].lazy+=tr[u].lazy; 
		tr[u*2].sum+=(tr[u*2].r-tr[u*2].l+1)*tr[u].lazy;//左儿子 
		
		tr[u*2+1].lazy+=tr[u].lazy;
		tr[u*2+1].sum+=(tr[u*2+1].r-tr[u*2+1].l+1)*tr[u].lazy;//右儿子
		 
		tr[u].lazy=0;//归零 
	}
}
void build(int u,int l,int r){//建树 
	tr[u].l=l;
	tr[u].r=r;
	if(tr[u].l==tr[u].r){//如果左右端点相等 
	    tr[u].sum=a[l];
	    tr[u].lazy=0;
	    return;
	}//二分继续 
	int mid=tr[u].l+tr[u].r/2;
	build(u*2,l,mid);build(u*2+1,mid+1,r);
	pushup(u);
}
void mofity(int u,int l,int r,int v){//区间更改 
	if(l<=tr[u].l&&tr[u].r<=r){//整个包含 
		tr[u].lazy+=v;
		tr[u].sum+=(tr[u].r-tr[u].l+1)/2*v;
		return;
	}
	pushdown(u);//标记下传 
	int mid=(tr[u].r-tr[u].l+1)/2;
	if(l<=mid){
		mofity(u*2,l,r,v);
	} 
	else if(mid<r){
		mofity(u*2+1,l,r,v);
	} 
	pushup(u);
}
int query(int u,int l,int r){//查询函数 
	if(l<=tr[u].l&&tr[u].r<=r){//整个包含 
		return tr[u].sum;
	}
	pushdown(u);//标记下传 
	int mid=(tr[u].r-tr[u].l+1)/2;
	int ans=0;  
	if(l<=mid) ans+=query(u*2,l,r);
	if(mid<r) ans+=query(u*2+1,l,r);
	return ans;
}
int main(){
	//主函数就不解释了 
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	while(m--){
		int op,x,y,k;
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d",&x,&y,&k);
			mofity(1,x,y,k);
		}
		else{
			scanf("%d%d",&x,&y);
			int ans;
			ans=query(1,x,y);
			cout<<ans<<endl;
		}
	}
	return 0;
}
//大佬帮忙调一下,谢谢了,跑都跑不起来 ,QAQ; 
//谢谢了, 谢谢了,谢谢了,谢谢了,谢谢了。 
//谢谢了, 谢谢了,谢谢了,谢谢了,谢谢了。 
//谢谢了, 谢谢了,谢谢了,谢谢了,谢谢了。 
//谢谢了, 谢谢了,谢谢了,谢谢了,谢谢了。 
//谢谢了, 谢谢了,谢谢了,谢谢了,谢谢了。 
//谢谢了, 谢谢了,谢谢了,谢谢了,谢谢了。 
2025/1/18 19:00
加载中...