蒟蒻刚学习线段树,后面三个测试点超时求助
查看原帖
蒟蒻刚学习线段树,后面三个测试点超时求助
554705
Skystars楼主2021/12/12 13:35
#include <iostream>
using namespace std;
#define int long long
int a[100005], t[400005];
int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	while (!isdigit(ch))
	{
		if (ch == '-')
		{
			f = -1;
		}
		ch = getchar();
	}
	while (isdigit(ch))
	{
		x = x * 10 + ch - 48;
		ch = getchar();
	}
	return x * f;
}

void build(int p, int l, int r) {
	if (l == r) {
		t[p] = a[l];
		return;
	}
	int mid = l + r >> 1;
	int lc = p << 1;
	int rc = lc | 1;
	build(lc, l, mid);
	build(rc, mid + 1, r);
	t[p] = t[lc] + t[rc];
}
int search(int sl, int sr, int p, int l, int r) {
	if (sl <= l && r <= sr)
		return t[p];
	int mid = l + r >> 1;
	int lc = p << 1;
	int rc = lc | 1;
	int sum = 0;
	if (sl <= mid)
		sum += search(sl, sr, lc, l, mid);
	if (sr > mid)
		sum += search(sl, sr, rc, mid + 1, r);
	return sum;
}
void modify(int sl, int sr, int p, int l, int r, int k) {
	if (l == r && sl <= l && r <= sr) {
		t[p] += k;
		return;
	}
	int dist = min(sr, r) - max(sl, l) + 1;
	t[p] += k * dist;
	int mid = l + r >> 1;
	int lc = p << 1;
	int rc = lc | 1;
	if (sl <= mid)
		modify(sl, sr, lc, l, mid, k);
	if (sr > mid)
		modify(sl, sr, rc, mid + 1, r, k);
}
signed main() {
	int n, m;
	n = read();
	m = read();
	for (int i = 1; i <= n; i++)
		a[i] = read();
	build(1, 1, n);
	while (m--) {
		short op;
		scanf("%hd", &op);
		if (op == 1) {
			int x, y, k;
			x = read();
			y = read();
			k = read();
			// modify
			modify(x, y, 1, 1, n, k);
		}
		else {
			int x, y;
			x = read();
			y = read();
			// search
			printf("%lld\n", search(x, y, 1, 1, n));
		}
	}
}
2021/12/12 13:35
加载中...