社区讨论

线段树求助

P1438无聊的数列参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lo8mx1f4
此快照首次捕获于
2023/10/27 21:14
2 年前
此快照最后确认于
2023/10/27 21:14
2 年前
查看原帖
RT,
只能过掉#1
CPP
#include <bits/stdc++.h>

using namespace std;

#define int long long

#define lc o << 1
#define rc o << 1 | 1

const int MN = 1e5 + 5;

int n, m;
int a[MN], sum[MN << 2], D[MN << 2], K[MN << 2];

void push_up(int o) {
	sum[o] = sum[lc] + sum[rc];
}

void build(int o, int l, int r) {
	if (l == r) {
		sum[o] = a[l];
		return ;
	}
	int mid = l + (r - l >> 1);
	build(lc, l, mid), build(rc, mid + 1, r);
	push_up(o);
}

void push_down(int o, int l, int r) {
	// if (!K[o] && !D[o]) return ;
	int mid = l + (r - l >> 1), x, y;
	K[lc] += K[o], D[lc] += D[o];
	x = K[o], y = K[o] + D[o] * (mid - l);
	sum[lc] += (x + y) * (mid - l + 1) / 2;
	K[o] += D[o] * (mid - l + 1);
	K[rc] += K[o], D[rc] += D[o];
	x = K[o], y = K[o] + D[o] * (r - mid - 1);
	sum[rc] += (x + y) * (r - mid) / 2;
	K[o] = D[o] = 0;
}

void modify(int o, int l, int r, int ql, int qr, int k, int d) {
	if (ql > r || qr < l) return ;
	if (ql <= l && r <= qr) {
		K[o] += k, D[o] += d;
		int x = k, y = k + d * (r - l);
		sum[o] += (x + y) * (r - l + 1) / 2;
		return ;
	}
	push_down(o, l, r);
	int mid = l + (r - l >> 1);
	modify(lc, l, mid, ql, qr, k, d);
	k += d * (mid - l + 1);
	modify(rc, mid + 1, r, ql, qr, k, d);
	push_up(o);
}

int query(int o, int l, int r, int x) {
	if (l == r) return sum[o];
	push_down(o, l, r);
	int mid = l + (r - l >> 1);
	if (x <= mid) return query(lc, l, mid, x);
	else return query(rc, mid + 1, r, x);
}

signed main() {
	ios::sync_with_stdio(false), cin.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	build(1, 1, n);
	for (int i = 1, op, l, r, k, d, p; i <= m; ++i) {
		cin >> op;
		if (op == 1) {
			cin >> l >> r >> k >> d;
			modify(1, 1, n, l, r, k, d);
		} else {
			cin >> p;
			cout << query(1, 1, n, p) << '\n';
		}
	}
	return 0;
}

回复

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

正在加载回复...