关于线段树
  • 板块学术版
  • 楼主happybob
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/1/22 15:57
  • 上次更新2023/10/28 11:33:21
查看原帖
关于线段树
332914
happybob楼主2022/1/22 15:57

题目:https://www.luogu.com.cn/problem/U199651

这个是我自己的题目,我用线段树造的数据,但是暴力+O2 在限时 1s1s 下不超时却 WA 了,是不是我线段树打错了?

线段树:

#include <cstdio>
#include <iostream>
using namespace std;

#define int long long

const int N = 1e5 + 5;
int n, v, xk;

struct Node
{
	int l, r, sum;
};

Node tree[N << 2];

void push_up(int u)
{
	tree[u].sum = tree[u << 1].sum + tree[u << 1 | 1].sum;
}

void build(int u, int l, int r)
{
	tree[u] = { l, r, xk };
	if (l == r) return;
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	push_up(u);
}

void modify(int u, int x, int y)
{
	if (tree[u].l == x && tree[u].r == x) tree[u].sum += y;
	else
	{
		int mid = (tree[u].l + tree[u].r) >> 1;
		if (x <= mid) modify(u << 1, x, y);
		else modify(u << 1 | 1, x, y);
		push_up(u);
	}
}

int query(int u, int l, int r)
{
	if (tree[u].l >= l && tree[u].r <= r) return tree[u].sum;
	int mid = (tree[u].l + tree[u].r) >> 1, ans = 0;
	if (l <= mid) ans += query(u << 1, l, r);
	if (r > mid) ans += query(u << 1 | 1, l, r);
	return ans;
}

signed main()
{
	scanf("%lld %lld %lld", &n, &xk, &v);
	build(1, 1, n);
	while (v--)
	{
		char ch;
		int a, b;
		cin >> ch >> a >> b;
		if (ch == 'x') modify(1, a, b);
		else
		{
			printf("%lld\n", query(1, a, b));
		}
	}
	return 0;
}
2022/1/22 15:57
加载中...