线段树求调
查看原帖
线段树求调
719942
zzq_helloworld楼主2022/4/30 16:35

以下是代码,样例的第二个输入有问题,但老看不出来。

#include <bits/stdc++.h>
using namespace std;

struct Seg {
	int l,r,sum;
} t[400001];

int a[100001];

void BuildTree(int x,int y,int num) {
	t[num].l = x,t[num].r = y;
	if(x == y) t[num].sum = a[y];
	else {
		int Lson = num << 1,Rson = Lson | 1;
		BuildTree(x,(x + y) >> 1,Lson);
		BuildTree(((x + y) >> 1) + 1,y,Rson);
		t[num].sum = t[Lson].sum + t[Rson].sum;
	}
}

void Update(int i,int j,int num) {
	t[num].sum += j;
	if(t[num].l == i && t[num].r == i) return;
	if(i > ((t[num].l + (t[num].r)) >> 1))
		Update(i,j,num << 1 | 1);
	else
		Update(i,j,num << 1);
}

int Query(int x,int y,int num) {
	if(x <= t[num].l && y >= t[num].r) return t[num].sum;
	int mid = (t[num].l + t[num].r) >> 1;
	int ans = 0;
	if(x <= mid)
		ans += Query(x,y,num << 1);
	if(y > mid)
		ans += Query(x,y,num << 1 | 1);
	return ans;
}

int main() {
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
	BuildTree(1,n,1);
	while(m--) {
		int choice,x,y,k;
		scanf("%d%d%d",&choice,&x,&y);
		if(choice == 1) {
			scanf("%d",&k);
			Update(x,y,1);
		}
		else printf("%d\n",Query(x,y,1));
	}
	return 0;
}

目前估测是修改或查询的问题,请各位大佬帮忙看看。

2022/4/30 16:35
加载中...