线段树板子求条
查看原帖
线段树板子求条
648705
Glax712124楼主2024/10/16 13:14
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n,m,num[100005];
struct node{
	ll l;
	ll r;
	ll sum;
	ll tag;
};
struct node xdtree[400005];
void build(ll p,ll l,ll r){
	xdtree[p].l=l;
	xdtree[p].r=r;
	if(l==r){
		xdtree[p].sum=num[l];
		return;
	}
	ll mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	xdtree[p].sum=xdtree[p*2].sum+xdtree[p*2+1].sum;
	return;
}
void spread(ll p){
	if(xdtree[p].tag){
		xdtree[p*2].sum+=xdtree[p].tag*(xdtree[p*2].l-xdtree[p*2].r+1);
		xdtree[p*2+1].sum+=xdtree[p].tag*(xdtree[p*2+1].l-xdtree[p*2+1].r+1);
		xdtree[p*2].tag+=xdtree[p].tag;
		xdtree[p*2+1].tag+=xdtree[p].tag;
		xdtree[p].tag=0;
	}
	return;
}
void change(ll p,ll l,ll r,ll d){
	if(l<=xdtree[p].l&&r>=xdtree[p].r){
		xdtree[p].sum+=(ll)d*(xdtree[p].r-xdtree[p].l+1);
		xdtree[p].tag+=d;
		return;
	}
	spread(p);
	ll mid=(xdtree[p].l+xdtree[p].r)/2;
	if(l<=mid){
		change(p*2,l,r,d);
	}
	if(r>mid){
		change(p*2+1,l,r,d);
	}
	xdtree[p].sum=xdtree[p*2].sum+xdtree[p*2+1].sum;
	return;
}
ll ask(ll p,ll l,ll r){
	if(l<=xdtree[p].l&&r>=xdtree[p].r){
		return xdtree[p].sum;
	}
	spread(p);
	ll mid=(xdtree[p].l+xdtree[p].r)/2;
	ll val=0;
	if(l<=mid){
		val+=ask(p*2,l,r);
	}
	if(r>mid){
		val+=ask(p*2+1,l,r);
	}
	return val;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		cin>>num[i];
	}
	build(1,1,n);
	for(ll i=1;i<=m;i++){
		ll op=0;
		cin>>op;
		if(op==1){
			ll x=0,y=0,k=0;
			cin>>x>>y>>k;
			change(1,x,y,k);
		}
		else{
			ll l=0,r=0;
			cin>>l>>r;
			cout<<ask(1,l,r)<<endl;
		}
	}
	return 0;
}

RT,不知道哪里写挂了,样例就是过不了……

望高人指点!

2024/10/16 13:14
加载中...