线段树求调
  • 板块灌水区
  • 楼主Wrx1011
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/7 20:29
  • 上次更新2024/8/7 21:26:29
查看原帖
线段树求调
1054957
Wrx1011楼主2024/8/7 20:29

这道题30分,求dalao调

#include <bits/stdc++.h>
using namespace std;
#define il inline
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
typedef long long ll;
const int MAXN=1e6+10;
ll xh[MAXN];
struct tree{
	int l,r;
	ll val,lazy;
};
struct seg{
	tree t[MAXN<<3];
	il void pu(int x){
		t[x].val=t[ls(x)].val+t[rs(x)].val;
		return;
	}
	il void pd(int x){
		if(t[x].lazy==0){
			return;
		}
		t[ls(x)].val+=(t[ls(x)].r-t[ls(x)].l+1)*t[x].lazy;
		t[rs(x)].val+=(t[ls(x)].r-t[ls(x)].l+1)*t[x].lazy;
		t[ls(x)].lazy+=t[x].lazy;
		t[rs(x)].lazy+=t[x].lazy;
		t[x].lazy=0;
		return;
	}
	il void build(int l,int r,int x){
		t[x].l=l,t[x].r=r;
		if(l==r){
			t[x].val=xh[l];
			return;
		}
		int mid=(l+r)>>1;
		build(l,mid,ls(x)),build(mid+1,r,rs(x));
		pu(x);
		return;
	}
	ll ask(int l,int r,int x){
		if(t[x].r<l||t[x].l>r){
			return 0;
		}
		if(t[x].l>=l&&t[x].r<=r){
			return t[x].val;
		}
		pd(x);
		return ask(l,r,ls(x))+ask(l,r,rs(x));
	}
	il void add(int l,int r,ll k,int x){
		if(t[x].r<l||t[x].l>r){
			return;
		}
		if(t[x].l>=l&&t[x].r<=r){
			t[x].val+=(t[x].r-t[x].l+1)*k;
			t[x].lazy+=k;
			return;
		}
		pd(x);
		add(l,r,k,ls(x)),add(l,r,k,rs(x));
		pu(x);
		return;
	}
}s;
int main(){
	int x,h,l,r;
	ll k;
	cin>>x>>h;
	for(int i=1;i<=x;i++){
		cin>>xh[i];
	}
	s.build(1,x,1);
	for(int i=1;i<=h;i++){
		int j;
		cin>>j;
		switch(j){
			case 1:
				cin>>l>>r>>k;
				s.add(l,r,k,1);
				break;
			case 2:
				cin>>l>>r;
				cout<<s.ask(l,r,1)<<"\n";
				break;
		}
	}
	return 0;
}
2024/8/7 20:29
加载中...