社区讨论

0pts 求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo21c0fj
此快照首次捕获于
2023/10/23 06:23
2 年前
此快照最后确认于
2023/11/03 06:46
2 年前
查看原帖
CPP
#include <stdio.h>
#define int long long
const int N = 1e5 + 10;
int n, m, a[N];
inline int ls(int u) { return u << 1; }
inline int rs(int u) { return u << 1 | 1; }
struct node {int num, tag;} tree[N << 2];
void PushUp(int u) { tree[u].num = tree[ls(u)].num + tree[rs(u)].num; }
void PushDown(int l, int r, int u) {
	if (l == r || !tree[u].tag) return;
	tree[ls(u)].tag += tree[u].tag; tree[rs(u)].tag += tree[u].tag;
	int m = l + r >> 1;
	tree[ls(u)].num += tree[u].tag * (m - l + 1); tree[rs(u)].num += tree[u].tag * (r - m);
	tree[u].tag = 0;
}
void Build(int l, int r, int u) {
	if (l == r) { tree[u].num = a[l] - a[l - 1]; return;}
	int m = l + r >> 1;
	Build(l, m, ls(u)); Build(m + 1, r, rs(u));
	PushUp(u);
}
void Update(int L, int R, int k, int l, int r, int u) {
	if (L <= l && r <= R) { tree[u].num += k * (r - l + 1); tree[u].tag += k; return; }
	PushDown(l, r, u);
	int m = l + r >> 1;
	if (L <= m) Update(L, R, k, l, m, ls(u));
	if (m < R) Update(L, R, k, m + 1, r, rs(u));
	PushUp(u);
}
int Query(int L, int R, int l, int r, int u) {
	if (L <= l && r <= R) { return tree[u].num; }
	PushDown(l, r, u);
	int sum = 0, m = l + r >> 1;
	if (L <= m) sum += Query(L, R, l, m, ls(u));
	if (m < R) sum += Query(L, R, m + 1, r, rs(u));
	return sum;
}
signed main() {
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	Build(1, n, 1);
	while (m--) {
		int opt;
		scanf("%lld", &opt);
		if (opt == 1) {
			int l, r, k, d;
			scanf("%d%d%d%d", &l, &r, &k, &d);
			Update(l, l, k, 1, n, 1);
			if (l + 1 <= r) Update(l + 1, r, d, 1, n, 1);
			if (r + 1 <= n) Update(r + 1, r + 1, -k - d * (r - l), 1, n, 1);
		} else {
			int p;
			scanf("%lld", &p);
			printf("%lld\n", Query(1, p, 1, n, 1));
		}
	}
	return 0;
}
本地样例甚至都没过,并且返回3221225477

回复

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

正在加载回复...