[Ybt Advanced4-4-1]間隔の合計を求める

間隔の合計を見つける

トピックリンク:ybt効率的な高度な4-4-1

一般的なアイデア

最初はすべて0である配列を指定し、単一点の加算と区間の合計の2つの操作を実装する必要があります。

アイデア

言うまでもなく、直接線分ツリーはアップ操作のみを必要とします。

コード

#include<cstdio>
#define ll long long

using namespace std;

struct Tree {
    
    
	ll x, lazy;
}tree[800001];
int n, m;
int op, x, y;

void up(int now) {
    
    
	tree[now].x = tree[now << 1].x + tree[now << 1 | 1].x;
}

void add(int now, int l, int r, int pl, int add_num) {
    
    
	if (l == r) {
    
    
		tree[now].x += add_num;
		return ;
	}
	
	int mid = (l + r) >> 1;
	if (pl <= mid) add(now << 1, l, mid, pl, add_num);
		else add(now << 1 | 1, mid + 1, r, pl, add_num);
	
	up(now);
}

ll get_sum(int now, int l, int r, int L, int R) {
    
    
	if (L <= l && r <= R) return tree[now].x;
	
	int mid = (l + r) >> 1;
	ll re = 0;
	if (L <= mid) re += get_sum(now << 1, l, mid, L, R);
	if (mid + 1 <= R) re += get_sum(now << 1 | 1, mid + 1, r, L, R);
	return re;
}

int main() {
    
    
	scanf("%d %d", &n, &m);
	
	for (int i = 1; i <= m; i++) {
    
    
		scanf("%d %d %d", &op, &x, &y);
		if (op == 0) add(1, 1, n, x, y);
			else printf("%lld\n", get_sum(1, 1, n, x, y));
	}
	
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_43346722/article/details/115272830