社区讨论
蒟蒻求教
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...