WA10求调
查看原帖
WA10求调
1190570
BC120701楼主2024/8/24 16:48

rt

#include <bits/stdc++.h>
using namespace std;
//线段树 
const int N=1e5+10;
struct tre{
	long long dat,tag; 
}t[4*N];
int n,m;
long long nums[N];
int search(int l,int r,int x,int l_x,int r_x){
	if(l<=l_x && r_x<=r) return t[x].dat;
	int mid=(l_x+r_x)/2,ans=0;
	//先下放懒标记 
	if(t[x].tag>0 && l_x!=r_x){
		t[x*2].dat+=t[x].tag*(mid-l+1);
		t[x*2+1].dat+=t[x].tag*(r-(mid+1)+1);
		t[x*2].tag+=t[x].tag;
		t[x*2+1].tag+=t[x].tag;
		t[x].tag=0;
	}
	if(mid>=l){//与左儿子的区间有相交 
		ans+=search(l,r,2*x,l_x,mid);
	}
	if(mid+1<=r){//与右儿子的区间有相交 
		ans+=search(l,r,2*x+1,mid+1,r_x);
	}
	return ans;
}
void build(int x,int l,int r){
	if(l==r){//找到叶子节点 
		t[x].dat=nums[l];
		return ;
	}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	t[x].dat=t[x*2].dat+t[x*2+1].dat;
}
void add(int l,int r,int x,int l_x,int r_x,int num){
	int ans=0;
	if(l<=l_x && r_x<=r){//能完全覆盖 
	    t[x].dat+=num*(r_x-l_x+1);
		t[x].tag+=num;//打上懒标记 
		return ;
	}
	int mid=(l_x+r_x)/2;
	if(mid>=l){//与左儿子的区间有相交 
		add(l,r,x*2,l_x,mid,num);
	}
	if(mid+1<=r){//与右儿子的区间有相交 
		add(l,r,x*2+1,mid+1,r_x,num);
	}
	t[x].dat=t[x*2].dat+t[x*2+1].dat;//用子节点来更新当前节点 
}
int main(){
	int a,b,c,d;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>nums[i];
	build(1,1,n);
	while(m--){
		cin>>a;
		if(a==1){
			cin>>b>>c>>d;
			add(b,c,1,1,n,d);
		}
		else{
			cin>>b>>c;
			cout<<search(b,c,1,1,n)<<endl;
		}
	}
	return 0;	
}
/*
常年做数据结构的人大都目光呆滞,极度自卑,且智商逐年下降,最后完全沦为傻子。
做数据结构会破环身体结构,引发各种不治之症。人一旦开始做数据结构就说明这个人的智慧品行样貌通通都是下等,这辈子只能在阴沟里苟延残喘。
做数据结构的人具有强烈的反社会倾向,对治安稳定造成破坏,危害正常人的生命。
*/
2024/8/24 16:48
加载中...