社区讨论

蒟蒻求教

学术版参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7vxhch
此快照首次捕获于
2025/11/21 04:29
4 个月前
此快照最后确认于
2025/11/21 04:29
4 个月前
查看原帖
下面是一个线段树的板子
然而我太菜了不会调用函数
麻烦各位dalao帮我看一下怎么调用Tree里的东西
CPP
#include <bits/stdc++.h>
#define lson (ind*2)
#define rson (ind*2+1)
using namespace std;
int a[200010]; 
struct Tree{
static const int maxn = 100010;
struct node {
	int l,r;
	int sum;
	int lazy;
	int get_sum(){
		return sum + (r - l + 1)*lazy;
	}
};
node no[maxn*4];
void push_up(int ind){
	no[ind].sum = no[lson].get_sum() + no[rson].get_sum();
}
void push_down(int ind){
	no[lson].lazy+=no[ind].lazy;
	no[rson].lazy+=no[ind].lazy;
	no[ind].lazy = 0;
}
void build(int l,int r,int ind){
	no[ind].l = l;
	no[ind].r = r;
	if (l == r){
		no[ind].sum = a[l];
	}
	else{
		int mid = (l+r)/2;
		build(1,mid,lson);
		build(mid+1,r,rson);
		push_up(ind);
	}
}
void update(int l,int r,int ind,int val){
	if(l > no[ind].r || r < no[ind].l )return;
	if(l <= no[ind].l && no[ind].r <= r){
		no[ind].lazy += val;
	}
	else {
		push_down(ind);
		query(l,r,lson,val);
		query(l,r,rson,val);
		push_up(ind);
	}
}
void query(int l,int r,int ind,int& ans){
	if(l > no[ind].r || r < no[ind].l )return;
	if(l <= no[ind].l && no[ind].r <= r){
		ans += no[ind].get_sum();
	}
	else {
		push_down(ind);
		query(l,r,lson,ans);
		query(l,r,rson,ans);
		push_up(ind);
	}
}
};

int n,q,ans;
int main(){
cin >> n;
Tree::.build(1,n,1);
for (int i = 1;i <= n;++i)cin >> a[i];
cin >> q;
for (int i = 1;i <= q;++i){
	int c,li,ri,newp;
	cin >> c;
	if(c == 0){
		cin >> li >> ri;
		Tree::no.query(li,ri,n,ans);
		cout << ans <<endl;
	}
	else{
		cin >> li >> ri >>newp;
		Tree::no.update(li,ri,n,newp);
	}
}
return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...