样例不过求调(玄关
查看原帖
样例不过求调(玄关
916276
b9113fced86a32cad0d8楼主2025/2/7 19:09
#include<bits/stdc++.h>
using namespace std;

struct node{
	int l,r;
	int num,tag;
}tree[400005];
int n,m;
int a[100005];

void build(int l,int r,int p){
	tree[p].l = l;
	tree[p].r = r;
	if(l == r){
		tree[p].num = a[l];
		return;
	}
	int mid = (l + r) / 2;
	build(l,mid,2 * p);
	build(mid + 1,r,2 * p + 1);
	tree[p].num = tree[2 * p].num + tree[2 * p + 1].num;
}
void add(int l,int r,int p,int x){
	if(l <= tree[p].l && tree[p].r <= r){
		tree[p].tag += x;
		tree[p].num += (r - l + 1) * x;
	}else{
		int mid = (l + r) / 2;
		add(l,mid,2 * p,x);
		add(mid + 1,r,2 * p + 1,x);
	}
}
void update(int p){
	tree[2 * p].num += (tree[2 * p].r - tree[2 * p].l + 1) * tree[p].tag;
	tree[2 * p].tag += tree[p].tag;
	tree[2 * p + 1].num += (tree[2 * p + 1].r - tree[2 * p + 1].l + 1) * tree[p].tag;
	tree[2 * p + 1].tag += tree[p].tag;
	tree[p].tag = 0;
}
int getsum(int l,int r,int p){
	update(p); 
	int mid = (l + r) / 2;
	if(tree[p].l > r || tree[p].r < l) return 0;
	if(l == r){
		return tree[p].num;
	}
	if(tree[p].l < l && tree[p].r > r){
		return tree[p].num;
	}
	return getsum(l,mid,2 * p) + getsum(mid + 1,r,2 * p + 1);
}

int main(){
	cin>>n>>m;
	for(int i = 1;i <= n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	for(int i = 1;i <= m;i++){
		int t;
		cin>>t;
		if(t == 1){
			int x,y,k;
			cin>>x>>y>>k;
			add(x,y,1,k);
		}
		if(t == 2){
			int x,y;
			cout<<getsum(x,y,1)<<endl;
		}
	}
} 

RT,代码见上,感谢各位大佬的Debug

2025/2/7 19:09
加载中...