线段树板子求调
查看原帖
线段树板子求调
534982
Chagely_Z楼主2022/8/13 10:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=120000;
int n,m,a[N];
struct tree{
	int l,r,dat,add;
}s[N*4+2];
void build(int p,int l,int r){
	s[p].l=l,s[p].r=r;
	if(l==r){
		s[p].dat=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	s[p].dat=s[p*2].dat+s[p*2+1].dat;
}
void spread(int p){
	if(s[p].add){
		s[p*2].dat+=s[p].add*(s[p*2].r-s[p*2].l+1);
		s[p*2+1].dat+=s[p].add*(s[p*2+1].r-s[p*2+1].l+1);
		s[p*2].add+=s[p].add,s[p*2+1].add+=s[p].add;
		s[p].add=0;
	}
}
void change(int p,int x,int y,int k){
	if(x<=s[p].l&&y>=s[p].r){
		s[p].dat+=k*(s[p].r-s[p].l+1);
		s[p].add+=k;
		return ;
	}
	spread(p);
	int mid=(s[p].r-s[p].l)/2;
	if(x<=mid) change(p*2,x,y,k);
	if(y>mid) change(p*2+1,x,y,k);
	s[p].dat+=s[p*2].dat+s[p*2+1].dat;
}
int ask(int p,int x,int y){
	if(x<=s[p].l&&y>=s[p].r) return s[p].dat;
	spread(p);
	int mid=(s[p].r-s[p].l)/2;
	int ans=0;
	if(x<=mid) ans+=ask(p*2,x,y);
	if(y>mid) ans+=ask(p*2+1,x,y);
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int c,x,y,k;
		cin>>c>>x>>y;
		if(c==1){
			cin>>k;
			change(1,x,y,k);
		}
		else{
			cout<<ask(1,x,y)<<endl;
		}
	}
	return 0;
}

疑似 ask 或 build 函数有问题,但我太蒟蒻了,找不出。

2022/8/13 10:12
加载中...