10pts求助
查看原帖
10pts求助
1272418
Unblocked_user楼主2024/12/13 22:24
#include<bits/stdc++.h>
#define lid id<<1
#define rid id<<1|1
#define int long long
using namespace std;
const int N=8e5+5,M=1e5+5;
int n,m,a[N];
int op,x,y,k;
struct qweqweqwe{
//	int l,r;
	int sum;
	int lazy;
}t[N];
void mt(int l,int r,int id){  //建树,确定没问题
	if(l==r){
		t[id].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	mt(l,mid,lid);
	mt(mid+1,r,rid);
	t[id].sum=t[lid].sum+t[rid].sum;
}
long long ask(int l,int r,int id){   //查询
	if(t[id].lazy){   //每次查询前更新当前节点
		t[id].sum+=(r-l+1)*t[id].lazy;
		t[lid].lazy+=t[id].lazy;
		t[rid].lazy+=t[id].lazy;
		t[id].lazy=0;
	}
	if(x<=l&&r<=y)return t[id].sum;  //全包含,直接返回
//	if(l==r)return t[id].sum;
	int mid=(l+r)>>1;
	long long res=0;
	if(x<=mid)res+=ask(l,mid,lid);
	if(y>mid)res+=ask(mid+1,r,rid);
	return res;
}
void change(int l,int r,int id){   //区间修改
	if(t[id].lazy){     //每次查询前更新当前节点
		t[id].sum+=1ll*(r-l+1)*t[id].lazy;
		t[lid].lazy+=t[id].lazy;
		t[rid].lazy+=t[id].lazy;
		t[id].lazy=0;
	}
	if(x<=l&&r<=y){    //全包含
		t[id].sum+=1ll*(r-l+1)*k;
		t[lid].lazy+=k;
		t[rid].lazy+=k;
		return;
	}
//	if(l==r)return;
	int mid=(l+r)/2;
	if(x<=mid)change(l,mid,lid);
	if(y>mid)change(mid+1,r,rid);
	t[id].sum=t[lid].sum+t[rid].sum;
}
signed main(){   //主函数,确定没错
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	mt(1,n,1);
	while(m--){
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			change(1,n,1);
		}
		else{
			cin>>x>>y;
			cout<<ask(1,n,1)<<endl;
		}
	}
	return 0;
}

已经用了各种手段了,真的调不出来了。

2024/12/13 22:24
加载中...