社区讨论

非差分做法9pts求条

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjo6g1t
此快照首次捕获于
2025/11/04 05:46
4 个月前
此快照最后确认于
2025/11/04 05:46
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXLEN = 1e5 + 5;
int n, m, a[MAXLEN];

struct node {
	int w, tagk, tagd;
} t[MAXLEN << 2];

void pushup(int x) {
	t[x].w = t[x << 1].w + t[x << 1 | 1].w;
	return ;
}

void build(int l, int r, int x) {
	if (l == r) {
		t[x].w = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	build(l, mid, x << 1);
	build(mid + 1, r, x << 1 | 1);
	pushup(x);
	return ;
}

void addtag(int x, int k, int d, int len) {
	t[x].w += len * k + (((len - 1) * len) >> 1) * d;
	t[x].tagk += k;
	t[x].tagd += d;
	return ;
}

void pushdown(int x, int l, int r) {
	if (t[x].tagd != 0 || t[x].tagk != 0) {
		int mid = (l + r) >> 1;
		addtag(x << 1, t[x].tagk, t[x].tagd, mid - l + 1);
		addtag(x << 1 | 1, (t[x].tagk + (mid - l + 1)*t[x].tagd), t[x].tagd, r - mid);
		t[x].tagd = t[x].tagk = 0;
	}
	return ;
}

void change(int cl, int cr, int l, int r, int k, int d, int x) {
	pushdown(x, l, r);
	if (cl <= l && r <= cr) {
		addtag(x, k + max(0ll, l - cl)*d, d, r - l + 1);
		return ;
	}
	int mid = (l + r) >> 1;
	if (cl <= mid) {
		change(cl, cr, l, mid, k + max(0ll, l - cl)*d, d, x << 1);
	}
	if (cr > mid) {
		change(cl, cr, mid + 1, r, k + (max(0ll, mid - cl + 1)*d), d, x << 1 | 1);
	}
	pushup(x);
}

int query(int q, int l, int r, int x) {
	pushdown(x, l, r);
	if (l == r && r == q) {
		return t[x].w;
	}
	int mid = (l + r) >> 1;
	if (q <= mid) {
		return query(q, l, mid, x << 1);
	}
	if (q > mid) {
		return query(q, mid + 1, r, x << 1 | 1);
	}
}

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

回复

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

正在加载回复...