社区讨论

线段树求调

P3372【模板】线段树 1参与者 4已保存回复 10

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@lo8b7vjb
此快照首次捕获于
2023/10/27 15:46
2 年前
此快照最后确认于
2023/10/27 15:46
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define N 100086
using namespace std;
struct name {
	int num,left,right;
} tree[N];
int in[N],ans;
int add(int x) {
	if(tree[x].left==tree[x].right) {
		tree[x].num=in[tree[x].right];
		return tree[x].num;
	}
	tree[x].num=add(x*2)+add(x*2+1);
	return tree[x].num;
}
void build(int x,int left,int right) {
	tree[x].left=left,tree[x].right=right;
	if(left==right)return ;
	int mid=(left+right)>>1;
	build(x*2,left,mid);
	build(x*2+1,mid+1,right);
}
void qjcx(int x,int left,int right) {
	if(tree[x].left>=left&&tree[x].right<=right) {
		ans+=tree[x].num;
		return ;
	}
	if(tree[x*2].right>=left)
		qjcx(x*2,left,right);
	if(tree[x*2+1].left<=right)
		qjcx(x*2+1,left,right);
}
void qjxg(int x,int l,int r,int k) {
	if(tree[x].left>=l&&tree[x].right<=r) {
		tree[x].num+=k;
		return ;
	}
	if(tree[x*2].right>=l)
		qjxg(x*2,l,r,k);
	if(tree[x*2+1].left<=r)
		qjxg(x*2+1,l,r,k);
}
int n,m,a,x,y,k;
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		cin>>in[i];
	}
	build(1,1,n);
	add(1);
	for(int i=1; i<=m; i++) {
		cin>>a>>x>>y;
		if(a==1) {
			cin>>k;
			qjxg(1,x,y,k);
		} else {
			ans=0;
			qjcx(1,x,y);
			cout<<ans<<'\n';
		}
	}
	return 0;
}

样例第三个20输出12,全wa

回复

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

正在加载回复...